如何从python中的stdin逐行读取

时间:2013-12-28 15:52:45

标签: python stdin

每个人都知道如何计算C中STDIN中的字符。但是,当我尝试在python3中执行此操作时,我发现它是一个谜题。 (counter.py)

import sys
chrCounter = 0

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

print(chrCounter)

然后我尝试通过

测试程序
python3 counter.py < counter.py

答案只是第一行“import sys”的长度。实际上,程序只读取标准输入的第一行,并丢弃其余部分。

如果我用sys.stdin.read()代替sys.stdin.readline它将会工作

import sys
print(len(sys.stdin.read()))

然而,显然,该程序不适合大量输入。请给我一个优雅的解决方案。谢谢!

3 个答案:

答案 0 :(得分:29)

更简单:

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

类似文件的对象sys.stdin会逐行自动迭代;如果你在它上面调用.readline(),你只能阅读第一行(并逐个字符地迭代);如果你调用read(),那么你将把整个输入读入一个字符串并迭代那个 character-by.character。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

Tim Pietzcker的答案是恕我直言,这是正确的答案。有两种类似的方法可以做到这一点。使用:

for line in sys.stdin:

for line in sys.stdin.readlines():

第二个选项更接近原始代码。这两个选项之间的区别通过使用例如以下修改了for循环体并使用键盘输入

for line in sys.stdin.readlines():
    line_len = len(line)
    print('Last line was', line_len, 'chars long.')
    chrCounter += len(line)

如果您使用第一个选项(for line in sys.stdin:),则在您按Enter键后立即处理这些行。

如果您使用第二个选项(for line in sys.stdin.readlines():),则首先读取整个文件,将其拆分为行,然后才处理它们。