当前位置: 首页 > 面试题库 >

如何从流中读取CSV文件并在写入每一行时对其进行处理?

赫连冠玉
2023-03-14
问题内容

我想从标准输入中读取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)

我的作者代码:

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)

输出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', '$$$$$$$$']

如您所见,所有打印语句都在同一时间执行,但是我希望会有500ms的间隔。


问题答案:

如文档中所述,

为了使for循环成为遍历文件行的最有效方法(一种非常常见的操作),该next()方法使用了隐藏的预读缓冲区。

您可以查看调用底层迭代器方法(via
)的csv模块的实现(784行)。csv.reader``next()``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))

例如,

$ 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]

您能解释一下为什么需要无缓冲读取CSV文件吗?无论您要做什么,都可能有更好的解决方案。



 类似资料:
  • 我想创建一个应用程序,每天从一个文件夹中读取一次多个xml文件,然后读取它们并提取数据并构建一个新的xml文件,我想知道哪个选项更适合这种情况: 使用Spring批处理读取并处理所有文件,然后写入新文件

  • 问题内容: 我有一个CSV文件,下面是其外观示例: 我知道如何读取文件并打印每列(例如- )。但是我真正想做的是读取行,就像这样,然后依此类推。 然后,我想将这些数字存储到变量中,以便稍后将它们总计(例如): 。那我可以做。 我将如何在Python 3中做到这一点? 问题答案: 您可以执行以下操作: 要么 : 编辑:

  • 我想读取一个csv文件,清理它,然后用Apache Beam Dataflow将结果写出csv。目的是使文件可加载到BigQuery中。清理规则是简单地用双引号转义双引号。我的清洁规则管用。我很难把它并入管道。我正在寻求关于我的清洁功能应该返回什么以及如何通过管道调用它的建议。

  • 我有以下代码: 使用System在我的控制台中输出代码。出来println(line)提供了正确的输出。然而,当我打开CSV文件时,它似乎是反向写入的。Excel首先抱怨行的数量。但是,仅显示原始数据集的最后一行。数据集(预处理效率很低)包含1000多行。因此,我不能简单地附加每个条目。 有更好的方法吗? 提示和技巧是非常受欢迎的。此外,我还尝试了几种编写器:-CSVwrite-BufferedW

  • 问题内容: 我有一个笨拙的csv文件,我需要跳过第一行来阅读它。 我正在使用python / pandas轻松做到这一点 但是我不知道如何在Go中做到这一点。 错误: : 问题答案: 读取csv文件时跳过第一行 例如, 输出:

  • 问题内容: 我的源数据在一个TSV文件中,包含6列和超过200万行。 这是我要完成的工作: 我需要读取此源文件中3列(3、4、5)中的数据 第五列是整数。我需要使用此整数值来复制行条目,并使用第三和第四列中的数据(按整数倍)。 我想将#2的输出写入CSV格式的输出文件。 以下是我想到的。 我的问题:这是一种有效的方法吗?尝试进行200万行时,它似乎很密集。 首先,我制作了一个示例选项卡单独的文件以