在Python2.7.6中读取stdin。Sys.stdout.flush()和python-u不';行不通
似乎许多人一直在努力让缓冲区、stdin和stout跨多种风格的Python工作。我正在用Python2.7.6编写一个脚本,从stdin读取数据,进行正则表达式匹配,并打印匹配字符串的列表 导入re,系统 条形码=[“条形码为:”] curr=条形码[0] #遍历stdin 对于sys.stdin.readlines()中的行: #正则表达式是否与行匹配在Python2.7.6中读取stdin。Sys.stdout.flush()和python-u不';行不通,python,python-2.7,stdout,stdin,eof,Python,Python 2.7,Stdout,Stdin,Eof,似乎许多人一直在努力让缓冲区、stdin和stout跨多种风格的Python工作。我正在用Python2.7.6编写一个脚本,从stdin读取数据,进行正则表达式匹配,并打印匹配字符串的列表 导入re,系统 条形码=[“条形码为:”] curr=条形码[0] #遍历stdin 对于sys.stdin.readlines()中的行: #正则表达式是否与行匹配 match=re.search(“(?以下是一些一次读取一行sys.stin的示例。它们不需要使用python-u选项 #! /usr/bi
match=re.search(“(?以下是一些一次读取一行sys.stin的示例。它们不需要使用python
-u
选项
#! /usr/bin/env python
import sys
def main():
count = 1
while True:
line = sys.stdin.readline()
if line == '':
break #EOF encountered
print "%3d: [%s]" % (count, line[:-1])
count += 1
if __name__ == '__main__':
main()
如果您使用的是Linux/Unix,这个版本会更好,因为它提供了行编辑功能
#! /usr/bin/env python
import sys
import readline
def main():
count = 1
while True:
try:
line = raw_input()
print "%3d: [%s]" % (count, line)
count += 1
except EOFError:
break
if __name__ == '__main__':
main()
sys.stdin
只是一个文件
对象,因此如果使用readlines()
,则将继续读取,直到所有行都被读取。只有在按住Ctrl+D键(在Linux中)时才会发生这种情况。请尝试逐行读取,如下所示:
#!/usr/bin/env python
import sys,re
while True:
line = sys.stdin.readline()
m = re.search("end", line)
if m:
break
else:
print "I read:" + line
解决办法很简单:
for line in sys.stdin:
# process line
由于
sys.stdin
是一个类似文件的对象,因此在其上迭代会在可用时一次生成一行。.readlines()
将一次性读取整个文件(或stdin)…您需要使用.read()
并自己查找换行符。请原谅,我已经阅读了有关文件对象的文档,我不清楚如何使用换行符遍历字符串sys.stdin.read()将返回。我是否应该尝试使用设置的字节数从stdin读取,然后将字符串解析为一个列表,然后在每个列表中迭代,直到我读取了整个文件?@DanBurkhardt:您是否尝试过对sys.stdin:中的行执行?@JohnZwinck我没有,但这确实有效。谢谢!我想我对它感到困惑了sys.stdin是一个文件对象,所以我没有寻找文件对象的方法。@DanBurkhardt:不客气。我添加它作为一个答案,因为它似乎对你有用。那么stdin的末尾在EOF处有一个文字“end”吗?我没想到对该字符串的重新搜索会起作用。“end”这只是我的例子。你应该编写代码来检测stdin的结尾。你可以根据你的要求指示stdin的结尾,比如说按下了一些输入字符串或CTRL+D。谢谢你。我之前见过类似的解决方案,但我觉得需要使用while True循环似乎很疯狂。我希望有办法避免它,但我没有在我的最后一个代码中,我最终使用了您的try:except块。我想这是因为stdin
是特殊的。您可以对sys中的行使用。stdin:
,但是您需要在每行(大约)的末尾发送一个EOF,这有点烦人。:)