在python中将单独的文件视为一个文件对象

时间:2016-06-04 17:53:41

标签: python file concatenation

我有一个分割文件(比如name.a0,name.a1,name.a2,...)

有没有办法让一个可读的类似文件的对象,这些对象的串联,不使用临时文件而不将它们全部加载到内存中?

2 个答案:

答案 0 :(得分:3)

python标准库中的fileinput模块正是用于此目的。

import fileinput
with fileinput.input(files=('name.a0', 'name.a1', 'name.a2')) as f:
    for line in f:
        process(line)

答案 1 :(得分:0)

您始终可以创建将一系列文件视为一个文件的代理对象。您需要实施足够的file object interface来满足您的计划需求。

例如,如果您所做的只是迭代所有这些文件中的行,则以下对象就足够了Python 2:

class MultiFile(object):
    def __init__(self, *filenames, mode='r'):
        self._filenames = reversed(filenames) # reversed iterable
        self._mode = mode
        sef._openfile = open(next(self._filenames), self._mode)

    def __enter__(self):
        return self

    def __exit__(self, *exception_info):
        self._openfile.close()

    __del__ = __exit__

    def __iter__(self):
        return self

    def __next__(self):
        try:
            return next(self._openfile)
        except StopIteration:
            # find next file to yield from, raises StopIteration
            # when self._filenames has run out
            while True:
                self._opefile.close()
                self._openfile = next(self._filenames)
                try:
                    return next(self._openfile, self._mode)
                except StopIteration:
                    continue

这使您可以阅读文件的系列,就像它是一样,随时读取行(所以永远不要把所有内容都记在内存中):

import glob

for line in MultiFile(glob.glob('name.a?')):
    # ...

请注意,在Python 3中(或在Python 2中使用io library时),您需要为文件模式(raw,buffered或text)实现适当的base classes之一