Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python2.7.6中读取stdin。Sys.stdout.flush()和python-u不';行不通_Python_Python 2.7_Stdout_Stdin_Eof - Fatal编程技术网

在Python2.7.6中读取stdin。Sys.stdout.flush()和python-u不';行不通

在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

似乎许多人一直在努力让缓冲区、stdin和stout跨多种风格的Python工作。我正在用Python2.7.6编写一个脚本,从stdin读取数据,进行正则表达式匹配,并打印匹配字符串的列表

导入re,系统 条形码=[“条形码为:”] curr=条形码[0] #遍历stdin 对于sys.stdin.readlines()中的行: #正则表达式是否与行匹配
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,这有点烦人。:)