Python中等价于Perl's while (<>) {...}的语句是什么?

23

我写了很多处理逐行文件的小脚本。在Perl中,我使用

while (<>) {
    do stuff;
}

这是很方便的,因为它不关心输入来自哪里(文件或 stdin)。

在 Python 中我使用这个

if len(sys.argv) == 2: # there's a command line argument
    sys.stdin = file(sys.argv[1])
for line in sys.stdin.readlines():
    do stuff

这似乎不是很优雅。是否有一种Python习语可以轻松处理文件/标准输入?


1
从“可读性代码”的角度来看,我更喜欢你的Python代码,因为大多数不使用Perl的人都不知道Perl代码的含义。 - schnaader
4
你至少可以省略掉.readlines()。 - Jiri
2
请问如何在Python中迭代命令行传递的所有文件的每一行? - S.Lott
9
对于不懂法语的人来说,法语非常难以阅读。 - Eisen
8
是的,但是对于懂英语的人来说,Python 有些可读性。 - Noah
显示剩余3条评论
3个回答

51

标准库中的fileinput模块正是你想要的:

import fileinput

for line in fileinput.input(): ...

确实。非常感谢。很抱歉我错过了另一个涉及相同问题的问题。这个标题很难找到... - Eisen

15
import fileinput
for line in fileinput.input():
    process(line)

如果sys.argv[1:]中有文件名,则对这些文件进行逐行迭代,否则默认从标准输入读取。


我正在将这些参数用于其他目的,我能禁用这种行为吗? - user1552512
@user1552512 是的,请参见 https://docs.python.org/2/library/fileinput.html :要指定替代文件名列表,请将其作为 input() 的第一个参数传递。也允许单个文件名。 - clacke

7

fileinput 默认使用标准输入,因此可以使代码更简洁。

但是,如果你经常使用命令行,这个管道技巧非常方便。


那个 Python 的代码非常整洁!谢谢! - Bklyn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接