通过python运行shell命令在windows机器中连接多个CSV文件

时间:2020-12-21 20:53:37

标签: python windows shell awk

目标:在特定条件下连接多个 CSV 文件。

  • 条件:Windows 10 机器 + 任何 shell 命令(例如,awk)+ Python <= 3.7。
  • 免责声明:我知道有很多方法可以做到这一点,其中包括:使用 Pandas 数据帧连接;或者使用 python 的 shutil;或者直接使用系统命令(例如,awk)而不在 shell 上使用 python。但同样,我想要一个完全符合上述条件的答案。

这是我当前正在尝试运行的 shell 命令示例(如果我直接在 shell 上运行,则该示例有效)

$ awk "(NR == 1) || (FNR > 1)" "..\\results\\raw*.csv" > "..\\results\\consolidated.csv"

这就是我通过 python 的 subprocess 运行它的方式:

src_files = os.path.join('..', 'results', 'raw*.csv')
dest_file = os.path.join('..', 'results', 'consolidated.csv')

result = subprocess.run('awk "(NR == 1) || (FNR > 1)" "{}" > "{}"'.format(src_files, dest_file),
                        shell=True,
                        capture_output=True)

但是,我不断收到以下错误:

print(result.stderr)

b"awk: fatal: cannot open file `..\\results\\raw*.csv' for reading (No such file or directory)\n"

我应该指出,如果我在 Unix 机器上运行这个 python 代码,它就可以工作(如果格式 {} 周围的引号被删除)。 python 代码在 Windows 机器上不起作用。

因此,我相信这可能与正确转义命令字符串有关,因为当我指定某些文件的名称时,此命令有效。尽管如此,我还是无法找到转义 * 符号的正确方法并使所有这些工作正常进行。

PS:为一个工作示例生成数据

for i in range(1, 4):
    pd.DataFrame([[i*1, i*2, i*3]], columns=['a', 'b', 'c']).to_csv(os.path.join('results', 'raw-{}.csv'.format(i)), index=False, sep=';')

PS2:使用的文件夹结构

|-- script_folder/
|   |-- consolidation_script.py
|-- results/
|   |-- raw-1.csv
|   |-- raw-2.csv
|   |-- raw-3.csv

1 个答案:

答案 0 :(得分:1)

考虑在定位当前脚本路径后使用 cwd 参数更改工作目录。是的,os.path.dirname() 被调用两次以获取当前目录的父目录。

import os, subprocess

# RETRIEVE CURRENT DIRECTORY OF SCRIPT
cd = os.path.dirname(os.path.abspath(__file__))

arglist = ["awk", "(NR == 1) || (FNR > 1)", "raw*.csv", ">", "consolidated.csv"]

result = subprocess.run(arglist,
                        cwd = os.path.join(os.path.dirname(cd), 'results'),
                        shell=True,
                        capture_output=True)
相关问题