簡體   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