gpt4 book ai didi

python - 使用 subprocess.call 从 Python 中调用 awk 时出现问题

转载 作者:行者123 更新时间:2023-12-01 03:35:50 25 4
gpt4 key购买 nike

从 Python 中调用 awk 时遇到一些问题。通常,我会执行以下操作从命令行调用 awk 中的命令。

  1. 打开命令行,无论是否处于管理模式。
  2. 将我的目录更改为awk.exe,即cd R\GnuWin32\bin
  3. 调用 awk -F ",""{ print > (\"split-\"$10\".csv\") }"large.csv

我的命令用于根据第10列将large.csv文件拆分为多个名为split-[COL VAL HERE].csv的文件。我运行这个命令没有任何问题。我尝试使用 subprocess.call() 在 Python 中运行相同的代码,但遇到了一些问题。我运行以下代码:

def split_ByInputColumn():
subprocess.call(['C:/R/GnuWin32/bin/awk.exe', '-F', '\",\"',
'\"{ print > (\\"split-\\" $10 \\".csv\\") }\"', 'large.csv'],
cwd = 'C:/R/GnuWin32/bin/')

很明显,当我执行该函数时(CPU 使用情况等),某些东西正在运行,但是当我去检查 C:/R/GnuWin32/bin/ 时,目录中没有拆分文件。知道出了什么问题吗?

最佳答案

正如我在之前被否决的答案中所说,您过度保护了参数,导致 awk 参数解析失败。

由于没有评论,我认为有一个拼写错误,但它有效...所以我想那是因为我应该强烈建议一个成熟的Python解决方案,这是这里最好的做法(如中所述)我之前的回答)

在 python 中编写等效的代码并不简单,因为我们必须模拟 awk 打开文件并随后附加到文件的方式。但它更加集成、Pythonic,并且如果输入文件中出现引用,则可以正确处理引用。

我花时间编码和测试它:

def split_ByInputColumn():
# get rid of the old data from previous runs
for f in glob.glob("split-*.csv"):
os.remove(f)

open_files = dict()

with open('large.csv') as f:
cr = csv.reader(f,delimiter=',')
for r in cr:
tenth_row = r[9]
filename = "split-{}.csv".format(tenth_row)
if not filename in open_files:
handle = open(filename,"wb")
open_files[filename] = (handle,csv.writer(handle,delimiter=','))
open_files[filename][1].writerow(r)

for f,_ in open_files.values():
f.close()

split_ByInputColumn()

详细:

  • 将大文件读取为 csv(优点:正确处理引用)
  • 计算目标文件名
  • 如果文件名不在字典中,则打开它并创建 csv.writer 对象
  • 在相应的字典中写入该行
  • 最后,关闭文件句柄

旁白:我的旧解决方案,正确使用 awk:

import subprocess

def split_ByInputColumn():
subprocess.call(['awk.exe', '-F', ',',
'{ print > ("split-" $10 ".csv") }', 'large.csv'],cwd = 'some_directory')

关于python - 使用 subprocess.call 从 Python 中调用 awk 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40408381/

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