Python连接文本文件

2024-04-20 15:28:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个20个文件名的列表,比如['file1.txt', 'file2.txt', ...]。我想编写一个Python脚本,将这些文件连接到一个新文件中。我可以通过f = open(...)打开每个文件,通过调用f.readline()逐行读取,并将每一行写入该新文件。对我来说,它似乎不太“优雅”,尤其是我必须逐行读写的部分。

在Python中有没有更“优雅”的方法来实现这一点?


Tags: 文件方法txt脚本列表readline文件名open
3条回答

使用shutil.copyfileobj

它会自动为您逐块读取输入文件,这样效率更高,在中读取输入文件,即使某些输入文件太大而无法放入内存,也会工作:

with open('output_file.txt','wb') as wfd:
    for f in ['seg1.txt','seg2.txt','seg3.txt']:
        with open(f,'rb') as fd:
            shutil.copyfileobj(fd, wfd)

这样就可以了

对于大文件:

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)

遗憾的是,最后一个方法留下了一些打开的文件描述符,GC无论如何都应该处理这些描述符。我只是觉得很有趣

这正是fileinput的目的:

import fileinput
with open(outfilename, 'w') as fout, fileinput.input(filenames) as fin:
    for line in fin:
        fout.write(line)

对于这个用例,它实际上并不比手动遍历文件简单得多,但是在其他情况下,使用一个迭代器遍历所有文件就好像它们是一个文件一样非常方便。(另外,事实上,fileinput一完成就关闭每个文件意味着不需要withclose每个文件,但这只是一行节省,没什么大不了的。)

fileinput中还有其他一些漂亮的特性,比如只需过滤每一行就可以对文件进行就地修改。


如注释中所述,并在另一个post中所讨论的,Python 2.7的fileinput将不会如所示工作。这里稍作修改,使代码与Python2.7兼容

with open('outfilename', 'w') as fout:
    fin = fileinput.input(filenames)
    for line in fin:
        fout.write(line)
    fin.close()

相关问题 更多 >