如何在python子流程中使用sed命令



在提出这个疑问之前,我搜索了其他答案。我在一台windows 11机器上运行。我得到的csv文件有一个";在某些行之间,这会在导入到mongodb时导致错误。所以我想删除它。所以我发现sed命令做这件事的速度非常快。你们中的大多数人可能会建议我在python中使用replace函数,但在这里这是不可行的,因为文件的大小是5GB。当我测试这两种方法时,我发现sed要快得多。

在我的系统中,我必须在命令终端中运行bash并进入bash模式,然后在那里运行sed命令。

我应该如何运行subprocess.run((命令来实现这一点。下面是我的代码

import subprocess
p = subprocess.run('bash' | r"sed -i 's/"/-/g' D:BackupfilesMAY2021Names.csv", shell=True, capture_output=True, check=True)
print(p.returncode)

下面给出的是我在运行上面的代码时得到的错误。

"C:UsersAEC Office Kollamanaconda3envsSDR Projectpython.exe" "C:/Users/AEC Office Kollam/Documents/Atom/Python/MongoDB/SDR Project/subprocesstutorial.py"
Traceback (most recent call last):
File "C:UsersAEC Office KollamDocumentsAtomPythonMongoDBSDR Projectsubprocesstutorial.py", line 3, in <module>
p = subprocess.run('bash' r"sed -i 's/"/-/g' D:BackupfilesMAY2021SDR1BSNLBSNL-DEC2020-EKYCC.csv", shell=True, capture_output=True, check=True)
File "C:UsersAEC Office Kollamanaconda3envsSDR Projectlibsubprocess.py", line 528, in run
raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command 'bashsed -i 's/"/-/g' D:BackupfilesMAY2021SDR1BSNLBSNL-DEC2020-EKYCC.csv' returned non-zero exit status 1.

如果您正在运行windows:

  1. 使用cygwin-https://www.geeksforgeeks.org/how-to-use-linux-commands-in-windows-with-cygwin/

  2. 使用sed-等命令

get-content somefile.txt | %{$_ -replace "expression","replace"}

get-content somefile.txt | where { $_ -match "expression"}
select-string somefile.txt -pattern "expression"

如果你正在运行linux,这将为你工作:

out_file = open(outp, "w")
sub = subprocess.call(['sed', 's/"//g', inp], stdout=out_file )

sed只是bash从某个地方运行的程序,因此您应该能够直接使用subprocess.run(如果您使用的是旧版本的Python,则可以使用subprocess.call(运行它。

在bash中,使用type -p sed来查找sed程序的位置。

我建议你考虑一下你是否真的需要shell=True。我的猜测是你没有。Tal Folkman的答案中的Linux代码应该可以做到这一点。大多数时候,在这里使用shell只会增加引用的麻烦。

如果真的想要进行bash,则必须使用-c标志进行bash。类似的东西

subprocess.run([r'C:whateverbash.exe', '-c', 'sed -i -e "s/foo/bar/" input.dat'])

多亏了以上两个答案,我才找到了问题的答案。

我的csv文件包含一个";没有和结束";。csv文件太大,python replace命令无法处理。这是我的最后一个代码。

import subprocess
subprocess.run(["bash", "-c", "sed -i 's/"//g' Name.csv"], capture_output=True, shell=True, check=True)

sed -i 's/"//g' Name.csv在这里,我们必须使用才能使命令工作。除此之外,我们可以使用此命令来替换任何类型的文件上的任何内容。

感谢您的见解每个人

最新更新