2017-05-05 32 views
3

我正在運行一個Python腳本,它需要從Postgres數據庫的CSV轉儲,然後我想在所有轉義雙引號這些文件。所以我使用sed來做到這一點。
在我的Python代碼:sed命令運行使用os.system()或subprocess.call()離開csv文件沒有分隔符

sed_for_quotes = 'sed -i s/\\"//g /home/ubuntu/PTOR/csvdata1/'+table+'.csv' 
subprocess.call(sed_for_quotes, shell=True) 

的過程完成,沒有任何錯誤,但是當我加載這些表紅移,我得到錯誤No delimiter found,並在檢查的CSV,我發現其中一列只有一半例如,如果它是一個時間戳列,那麼只有一半的數據被加載,並且表中沒有數據(而實際的CSV在運行sed之前有這些數據)。這導致No delimiter found錯誤。

但是,當我在shell上運行sed -i s/\"//g filename.csv這些文件時,它工作正常,並且運行sed後的csv包含所有行。我檢查了文件中的數據沒有問題。

這是不是在Python程序中工作的原因是什麼?我也嘗試在Python程序中使用sed -i.bak,但這沒有什麼區別。

請注意我在Python代碼中使用了一個額外的反斜槓(\),因爲我需要轉義另一個反斜槓。
其他方法試圖

  • 使用subprocess.Popen沒有任何緩衝區的大小,並用積極的緩衝區大小,但是這並沒有幫助
  • 使用subprocess.Popen(sed_for_quotes,bufsize=-4096)(負緩衝區大小)的 的文件中的一個,其工作正在給出錯誤,但後來在另一個文件中遇到了同樣的 問題。
+0

是的,第一個反衝是爲了「第二個是爲了逃避第三個反斜槓。我打印'sed_for_quotes'以確保它與我運行的shell sed命令相同,所以它沒有問題。 – Yankee

+0

有您嘗試使用原始字符串? – Merlin1896

+0

@ Merlin1896,對不起,我不明白。我正在使用原始字符串AFAIK。 – Yankee

回答

0

將您的sed放入shell script,例如,使用

sed_for_quotes = 'my_sed_script /home/ubuntu/PTOR/csvdata1/'+table+'.csv' 

使用docs.python.org/3.6: shlex.split
shlex.split(S,評論=假POSIX = TRUE)
分割字符串s:

#!/bin/bash 
# Parameter $1 = Filename 
sed -i 's/"//g' "$1" 

打電話給你shell script使用subprocess類似shell的語法。

+0

我曾嘗試過,但它不起作用。謝謝您的幫助。 – Yankee

+0

@Yankee:更新我的答案 – stovfl

+0

我也試過。沒有工作。我已經找出了這個問題,但是我會在每一次確認它都能正常工作的時候添加一個答案。感謝您的幫助。 – Yankee

1

當你不需要時不要使用中間shell。並檢查子進程的返回代碼,以確保它成功完成(check_call爲您完成此)

path_to_file = ... # e.g. '/home/ubuntu/PTOR/csvdata1/' + table + '.csv' 
subprocess.check_call(['sed', '-i', 's/"//g', path_to_file]) 

通過「中間」殼體我的意思是subprocess運行shell進程,通過空格解析命令(±分裂但不僅)並運行它(在此示例中運行sed)。由於您確切知道應該調用什麼參數sed,因此您不需要所有這些,最好避免這種情況。

+0

Agreed ='shell = True'在幾乎所有情況下都不是你想要的。 – dimo414

相關問題