filenames = ['file1.txt', 'file2.txt', ...]
with open('path/to/output/file', 'w') as outfile:
for fname in filenames:
with open(fname) as infile:
for line in infile:
outfile.write(line)
对于小文件:
filenames = ['file1.txt', 'file2.txt', ...]
with open('path/to/output/file', 'w') as outfile:
for fname in filenames:
with open(fname) as infile:
outfile.write(infile.read())
…还有我想到的另一个有趣的问题:
filenames = ['file1.txt', 'file2.txt', ...]
with open('path/to/output/file', 'w') as outfile:
for line in itertools.chain.from_iterable(itertools.imap(open, filnames)):
outfile.write(line)
使用
shutil.copyfileobj
。它会自动为您逐块读取输入文件,这样效率更高,在中读取输入文件,即使某些输入文件太大而无法放入内存,也会工作:
这样就可以了
对于大文件:
对于小文件:
…还有我想到的另一个有趣的问题:
遗憾的是,最后一个方法留下了一些打开的文件描述符,GC无论如何都应该处理这些描述符。我只是觉得很有趣
这正是fileinput的目的:
对于这个用例,它实际上并不比手动遍历文件简单得多,但是在其他情况下,使用一个迭代器遍历所有文件就好像它们是一个文件一样非常方便。(另外,事实上,
fileinput
一完成就关闭每个文件意味着不需要with
或close
每个文件,但这只是一行节省,没什么大不了的。)在
fileinput
中还有其他一些漂亮的特性,比如只需过滤每一行就可以对文件进行就地修改。如注释中所述,并在另一个post中所讨论的,Python 2.7的
fileinput
将不会如所示工作。这里稍作修改,使代码与Python2.7兼容相关问题 更多 >
编程相关推荐