我有一个分割文件(比如name.a0,name.a1,name.a2,...)
有没有办法让一个可读的类似文件的对象,这些对象的串联,不使用临时文件而不将它们全部加载到内存中?
答案 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之一