在Python中调用awk时遇到一些问题。通常,我会执行以下操作从命令行调用awk中的命令。
awk.exe
,即cd R\GnuWin32\bin
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/
时,目录中没有拆分文件。对于出了什么问题的任何想法?
答案 0 :(得分:1)
其他人发布了一个答案(随后将其删除),但问题是我过度保护了我的论点。以下代码有效:
def split_ByInputColumn():
subprocess.call(['C:/R/GnuWin32/bin/awk.exe', '-F', ',',
'{ print > (\"split-\" $10 \".csv\") }', 'large.csv'],
cwd = 'C:/R/GnuWin32/bin/')
答案 1 :(得分:1)
正如我在之前的回答中所说的那样,你过度保护参数,使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.writer
对象旁白:我的旧解决方案,正确使用awk
:
import subprocess
def split_ByInputColumn():
subprocess.call(['awk.exe', '-F', ',',
'{ print > ("split-" $10 ".csv") }', 'large.csv'],cwd = 'some_directory')