我试图将目录中的多个文件连接到一个文件。到目前为止,我一直在尝试使用带有子进程的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?
答案 0 :(得分:1)
此处不需要subprocess
,您必须始终避免subprocess
(这意味着:99.99%的时间)。
正如Joel在评论中指出的那样,也许我应该花几分钟时间来解释你原因:
subprocess
(或类似)假设您的代码将始终在完全相同的环境中运行,这意味着安装了相同的操作系统,版本,shell,工具等。这实际上不适合生产级代码try
/ except
等来处理错误。换句话说: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/
)