我正在运行一个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)
(负缓冲区大小)为其中一个工作
给出错误的文件,但后来遇到了同样的错误
另一个文件中的问题。答案 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。