在python中使用子进程和通配符连接文件列表

时间:2018-02-19 12:42:41

标签: python subprocess

我试图将目录中的多个文件连接到一个文件。到目前为止,我一直在尝试使用带有子进程的cat,效果不佳。

我原来的代码是:

source = ['folder01/*', 'folder02/*']
target = ['/output/File1', '/output/File2']

for f1, f2, in zip(source, target):
    subprocess.call(['cat', f1, '>>', f2])

我试过把它交给shell = True:

..., f2], shell=True)

与subprocess.Popen一起使用而不是调用多个排列,但没有任何乐趣。

正如我从其他类似问题中所理解的那样,使用shell = True时,命令将需要作为字符串提供。如何以字符串形式执行时,如何在列表中的所有项目上调用cat?

1 个答案:

答案 0 :(得分:1)

此处不需要subprocess,您必须始终避免subprocess(这意味着:99.99%的时间)。

正如Joel在评论中指出的那样,也许我应该花几分钟时间来解释你原因:

  1. 使用subprocess(或类似)假设您的代码将始终在完全相同的环境中运行,这意味着安装了相同的操作系统,版本,shell,工具等。这实际上不适合生产级代码
  2. 这类库会阻止您制作“pythonic Python代码”,您必须通过解析字符串而不是try / except等来处理错误。
  3. Tim Peters写了Python的禅,我鼓励你遵循它,至少有3点与此相关:“美丽胜过丑陋。”,“可读性计数。< / em>“和”简单比复杂更好。“。
  4. 换句话说:subprocess只会使你的代码不那么健壮,迫使你处理非Python问题,强迫你执行棘手的计算,你可以编写干净而强大的Python代码。

    有更好的理由不使用subprocess,但我认为你明白了。

    只需使用open打开文件,这是您需要调整的基本示例:

    import os
    
    for filename in os.listdir('./'):
        with open(filename, 'r') as fileh:
            with open('output.txt', 'a') as outputh:
                outputh.write(fileh.read())
    

    满足您特定需求的实施示例:

    import os
    
    sources = ['/tmp/folder01/', '/tmp/folder02/']
    targets = ['/tmp/output/File1', '/tmp/output/File2']
    
    # Loop in `sources`
    for index, directory in enumerate(sources):
        # Match `sources` file with expected `targets` directory
        output_file = targets[index]
        # Loop in files within `directory`
        for filename in os.listdir(directory):
            # Compute absolute path of file
            filepath = os.path.join(directory, filename)
            # Open source file in read mode
            with open(filepath, 'r') as fileh:
                # Open output file in append mode
                with open(output_file, 'a') as outputh:
                    # Write content into output
                    outputh.write(fileh.read())
    

    小心,我更改了源和目标值(/tmp/