使用os.system()或subprocess.call()运行sed命令会在没有分隔符的情况下保留csv文件

时间:2017-05-05 10:25:20

标签: python bash shell csv sed

我正在运行一个Python脚本,它从Postgres数据库中转储CSV,然后我想在所有这些文件中转义双引号。所以我用sed这样做 在我的Python代码中:

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

该过程完成没有任何错误,但是当我将这些表加载到Redshift时,我收到错误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)(负缓冲区大小)为其中一个工作 给出错误的文件,但后来遇到了同样的错误 另一个文件中的问题。

1 个答案:

答案 0 :(得分:0)

sed放入shell script,例如

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

使用shell script

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

使用docs.python.org/3.6: shlex.split
  shlex.split(s,comments = False,posix = True)
      使用类似shell的语法拆分字符串s。