-3

我有一个关于如何从 100 个文件中添加条目(每个文件包含两列)然后将它们写入一个新文件(也将包含两列)的问题?

4

4 回答 4

0

不确定您是否也需要找到所有这 100 个文件的解决方案?如果是这样,这是一种方法,包括将它们全部读取并将它们写入连接文件:

from os import walk
from os.path import abspath

lines = []
for root, folders, files in walk('./path/'):
    for file in files:
        fh = open(abspath(root + '/' + file), 'rb')
        lines.append(fh.read())
        fh.close()
    # break if you only want the first level of your directory tree

o = open('output.txt', 'wb')
o.write('\n'.join(lines))
o.close()

你也可以做一个“内存高效”的解决方案:

from os import walk
from os.path import abspath

o = open('output.txt', 'wb')

for root, folders, files in walk('./path/'):
    for file in files:
        fh = open(abspath(root + '/' + file), 'rb')
        for line in fh.readline():
            o.write(line)
            del line
        fh.close()
        del fh
    # break if you only want the first level of your directory tree

o.close()

其中大部分是在 Python 中自动化的(我认为),但不管是否懒惰,如果您可以在关闭文件之后以及重用变量名之前和之前从内存中删除对象.. 以防万一?

于 2013-02-05T12:59:46.617 回答
0

你想把它们锁起来吗?即,你想要文件 1 的所有行,然后是文件 2 的所有行,......还是你想要合并它们?文件 1 的第 1 行,文件 2 的第 1 行,...

对于第一种情况:

from itertools import chain
filenames = ...
file_handles = [open(fn) for fn in filenames]

with open("output.txt", "w") as out_fh:
    for line in chain(file_handles):
        out_fh.write(line)

for fh in file_handles:
    fh.close()

对于第二种情况:

from itertools import izip_longest
filenames = ...
file_handles = [open(fn) for fn in filenames]

with open("output.txt", "w") as out_fh:
    for lines in izip_longest(*file_handles, fillvalue=None):
        for line in lines:
            if line is not None:
                out_fh.write(line)

for fh in file_handles:
    fh.close()

重要提示:永远不要忘记关闭您的文件!

正如@isedev 指出的那样,这种方法对于 100 个文件是可以的,但是当我立即打开所有句柄时,对于数千个文件来说这是行不通的。

如果你想克服这个问题,只有选项1(链接)是合理的......

filenames = ...

with open("output.txt", "w") as out_fh:
    for fn in filenames:
        with open(fn) as fh:
            for line in fh:
                out_fh.write(line)
于 2013-02-05T12:55:02.497 回答
0

这是非常不明确的。目前尚不清楚您的问题是什么。

可能你会做类似的事情:

entries = []
for f in ["file1.txt", "file2.txt", ..., "file100.txt"]:
  entries.append(open(f).readlines())
o = open("output.txt", "w")
o.writelines(entries)
o.close()
于 2013-02-05T12:56:14.437 回答
0

一种更具可扩展性的方式,受 Torxed 方法的启发

from os import walk
from os.path import abspath

with open('output.txt', 'wb') as o:
    for root, folders, files in walk('./path/'):
        for filename in files:
            with open(abspath(root + '/' + filename), 'rb') as i:
                for line in i:
                    o.write(line)
于 2013-02-05T13:07:03.560 回答