繁体   English   中英

使用subprocess.call从Python内部调用awk的问题

[英]Issues calling awk from within Python using subprocess.call

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

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

我的命令用于根据第十列将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/时,目录中没有拆分文件。 有什么问题的主意吗?

有人发布了答案(然后将其删除),但问题是我过度保护了我的论点。 以下代码有效:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM