muh*_*huk 31 python csv stream line-by-line
我想从标准输入读取一个CSV文件并处理每一行.我的CSV输出代码逐个写入行,但我的读者在迭代行之前等待流终止.这是csv模块的限制吗?难道我做错了什么?
我的读者代码:
import csv
import sys
import time
reader = csv.reader(sys.stdin)
for row in reader:
print "Read: (%s) %r" % (time.time(), row)
Run Code Online (Sandbox Code Playgroud)
我的作家代码:
import csv
import sys
import time
writer = csv.writer(sys.stdout)
for i in range(8):
writer.writerow(["R%d" % i, "$" * (i+1)])
sys.stdout.flush()
time.sleep(0.5)
Run Code Online (Sandbox Code Playgroud)
产量python test_writer.py | python test_reader.py:
Read: (1309597426.3) ['R0', '$']
Read: (1309597426.3) ['R1', '$$']
Read: (1309597426.3) ['R2', '$$$']
Read: (1309597426.3) ['R3', '$$$$']
Read: (1309597426.3) ['R4', '$$$$$']
Read: (1309597426.3) ['R5', '$$$$$$']
Read: (1309597426.3) ['R6', '$$$$$$$']
Read: (1309597426.3) ['R7', '$$$$$$$$']
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,所有打印语句同时执行,但我预计会有500毫秒的差距.
Gar*_*ees 36
正如文档中所述,
为了使
for循环成为循环文件行的最有效方式(一种非常常见的操作),该next()方法使用隐藏的预读缓冲区.
您可以通过查看调用底层迭代器(via )的方法的csv模块(第784行)的实现来看到.csv.readernext()PyIter_Next
因此,如果您真的想要无缓冲读取CSV文件,则需要将文件对象(此处sys.stdin)转换为其next()方法实际调用的迭代器readline().这可以使用iter函数的双参数形式轻松完成.所以将代码更改为test_reader.py以下内容:
for row in csv.reader(iter(sys.stdin.readline, '')):
print("Read: ({}) {!r}".format(time.time(), row))
Run Code Online (Sandbox Code Playgroud)
例如,
$ python test_writer.py | python test_reader.py
Read: (1388776652.964925) ['R0', '$']
Read: (1388776653.466134) ['R1', '$$']
Read: (1388776653.967327) ['R2', '$$$']
Read: (1388776654.468532) ['R3', '$$$$']
[etc]
Run Code Online (Sandbox Code Playgroud)
你能解释为什么你需要无缓冲读取CSV文件吗?无论你想做什么,都可能有更好的解决方案.
| 归档时间: |
|
| 查看次数: |
31775 次 |
| 最近记录: |