我有一个使用大量文本来训练模型的脚本。现在我可以从文件或标准输入中读取它的编写方式
parser.add_argument('-i', help='input_file', default=sys.stdin)
... # do a bunch of other stuff
if args.i is sys.stdin:
m.train(args.i)
else:
m.train(open(args.i, 'r'))
然后我可以调用我的脚本:
python myscript.py -i trainingdata.txt
或
cat trainingdata.txt | python myscript.py
如果我想搜索文件系统并使用多个文件来训练模型,第二个版本特别有用。然而,由于管道的原因,如果我同时尝试使用 cProfiler
进行分析,这会变得很棘手。即
python -m cProfile myscript.py ...
我知道我可以使用 -i
向它发送多个文件选项,并遍历文件,但随后我将不得不更改 train()
的行为避免覆盖数据的方法。
有没有更好的方法来打开一个 IO channel ,因为没有更好的表达方式,连接输入而无需逐行显式读写?
最佳答案
你可以chain
打开文件并使用生成器 yield
从文件名打开文件:
from itertools import chain
def yield_open(filenames):
for filename in filenames:
with open(filename, 'r') as file:
yield file
def train(file):
for line in file:
print(line, end='')
print()
files = chain.from_iterable(yield_open(filenames=['file1.txt', 'file2.txt']))
train(files)
这还有一个额外的好处,即此时只有一个文件是打开的。
您也可以将其用作“数据管道”(可能更具可读性):
file_gen = yield_open(filenames=['file1.txt', 'file2.txt'])
files = chain.from_iterable(file_gen)
train(files)
关于Python 迭代处理多个文件,没有显式的 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44654283/