Python 迭代处理多个文件,没有显式的 for 循环

标签 python unix command-line io

我有一个使用大量文本来训练模型的脚本。现在我可以从文件或标准输入中读取它的编写方式

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/

相关文章:

unix - 删除 FASTA 文件中的换行符

windows - 如何使批处理文件删除它自己的目录?

python - 如何在 PySpark 中分别对多个列进行透视

python - 如何仅将列中的数值相乘

python - 将嵌套列表转换为 dict,其中列表的第一个元素是 dict 的关键

linux - 带有 if else 语句和调试问题的简单 bash 脚本

python - 我如何使用 scikit learn 迭代 python 中的 'list' 模型?

unix - 如何使用 UNIX shell 计算字母在文本文件中出现的次数?

command-line - 使用命令行在 Sublime Text 3 中打开文件夹

c - 关于用 C 语言为 FreeBSD 开发命令行应用程序的权威书籍是什么?