似乎许多人一直在努力获取缓冲区和stdin以及stout工作在多种Python上。我正在用Python 2.7.6编写一个脚本来从stdin读取,进行正则表达式匹配,并打印匹配字符串列表。
import re, sys
barcodes=["The barcodes are:"]
curr=barcodes[0]
#iterate through stdin
for line in sys.stdin.readlines():
#do regex match in line
match = re.search('(?<=\:)[GATC]{6}', line.rstrip()).group(0)
matched = 0
#see if match has been seen before
if (match == curr):
matched = 1
print "matched curr"
else:
for a , val in enumerate(barcodes):
if (match == val):
print str(a) + " : " + val + " barcodes[a] " + str(barcodes[a])
curr = barcodes[a]
print curr
matched = 1
print "matched iteration"
#if match hasn't been seen before
if (matched == 0):
sys.stdout.write("NEW match")
sys.stdout.flush()
barcodes.append(match)
#print report of barcodes
for i in barcodes:
print i
在我发现之前就像许多人一样,等待它从stdin读取EOF块以打印任何东西,我似乎无法找到任何关于如何从stdin读取进程运行/打印的文档。
要清楚,无论我是否使用-u标志调用Python,都会发生这种情况。
感谢您提供给我的任何指导。
答案 0 :(得分:1)
以下是一些一次读取sys.stdin一行的示例。他们不需要使用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()
答案 1 :(得分:1)
sys.stdin
只是一个file
对象,因此如果您使用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
答案 2 :(得分:0)
解决方案就是这样:
for line in sys.stdin:
# process line
由于sys.stdin
是一个类似文件的对象,因此迭代它会在它们可用时一次生成一行。