每个人都知道如何计算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()))
然而,显然,该程序不适合大量输入。请给我一个优雅的解决方案。谢谢!
答案 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():
),则首先读取整个文件,将其拆分为行,然后才处理它们。