gpt4 book ai didi

python - 使用 os.system() 或 subprocess.call() 运行的 sed 命令留下没有分隔符的 csv 文件

转载 作者:行者123 更新时间:2023-11-28 18:22:57 24 4
gpt4 key购买 nike

我正在运行一个 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)(负缓冲区大小)适用于其中一个给出错误但随后遇到相同错误的文件另一个文件中的问题。

最佳答案

不要在不需要时使用中间 shell。并检查子流程的返回代码以确保它成功完成(check_call 为您完成)

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

我所说的“中间”shell 是指由 subprocess 运行的 shell 进程,它解析命令(± 由空格分割但不仅如此)并运行它(运行 sed这个例子)。由于您确切地知道应该使用哪些参数调用 sed,因此您不需要所有这些并且最好避免这种情况。

关于python - 使用 os.system() 或 subprocess.call() 运行的 sed 命令留下没有分隔符的 csv 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43802542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com