如何在python中逐行读取stdin

如何在python中逐行读取stdin,python,stdin,Python,Stdin,每个人都知道如何在C中计算STDIN中的字符。然而,当我在python3中尝试这样做时,我发现这是一个难题。(counter.py) 然后我试着用 python3 counter.py < counter.py 然而,很明显,这个程序不适合大的输入。请给我一个优雅的解决方案。谢谢大家! 更简单: for line in sys.stdin: chrCounter += len(line) 像objectsys.stdin这样的文件会自动逐行迭代;如果对其调用.readline(

每个人都知道如何在C中计算STDIN中的字符。然而,当我在python3中尝试这样做时,我发现这是一个难题。(counter.py)

然后我试着用

python3 counter.py < counter.py
然而,很明显,这个程序不适合大的输入。请给我一个优雅的解决方案。谢谢大家!

更简单:

for line in sys.stdin:
    chrCounter += len(line)

像object
sys.stdin
这样的文件会自动逐行迭代;如果对其调用
.readline()
,则只读取第一行(并逐个字符迭代);如果调用
read()
,则将整个输入读取到单个字符串中,并逐字符对该字符串进行迭代。

如果我只需要一个字符计数,我会一次读取块,而不是一次读取行:

# 4096 chosen arbitrarily. Pick any other number you want to use.
print(sum(iter(lambda:len(sys.stdin.read(4096)), 0)))

蒂姆·皮耶茨克的回答是正确的。有两种类似的方法。使用:

for line in sys.stdin:

第二个选项更接近原始代码。这两个选项之间的区别可以通过以下对for循环体的修改和使用键盘输入来明确:

如果使用第一个选项(
,用于sys.stdin:
)中的行,则在按enter键后会立即处理这些行


如果使用第二个选项(
,用于sys.stdin.readlines()中的行):
),则首先读取整个文件,并将其拆分为行,然后才对其进行处理。

在按下enter键后,您能否解释一下您所说的
是什么意思?我有一个逐行打印输出的shell脚本,如果我使用管道(
$build.sh | my python file.py
)在sys.stdin:
中使用此方法
,我什么也得不到,但第二个选项可以正常工作。这已经是很久以前的事了,因为我已经回答了这个问题。我说的“在你按下回车键之后”是指一旦从标准输入中读取换行符,即一旦文件的迭代器准备好为调用代码提供下一行。我无法解释为什么第一种方法不适用于您的案例,但第二种方法可能会等到生成所有行,然后通过管道将它们传输到my-python-file.py,在那里一次处理所有行。好的,非常感谢。我会调查为什么选项1对我不起作用,如果我得到任何线索,我会在这里发布。
# 4096 chosen arbitrarily. Pick any other number you want to use.
print(sum(iter(lambda:len(sys.stdin.read(4096)), 0)))
for line in sys.stdin:
for line in sys.stdin.readlines():
for line in sys.stdin.readlines():
    line_len = len(line)
    print('Last line was', line_len, 'chars long.')
    chrCounter += len(line)