Python - csv 阅读器 - 阅读一个样本。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python - csv 阅读器 - 阅读一个样本。相关的知识,希望对你有一定的参考价值。

我正在做一个python项目,在这个项目中,我使用python csv lib读取csv文件。我不需要所有的文件数据,只需要几行来做一些分析。所以我只想读取一个样本(一定数量的行)。我可以简单地像下面这样做。

num_rows = 1000
with open(path, newline='') as my_file:
    sample_reader = csv.reader(my_file)
    count = 0
    for row in sample_reader:
        # do sth with row
        count += 1
        if count >= num_rows:
            break

我的问题是:"sample_reader

"sample_reader "如何在迭代的过程中读取行数?它是否在每次for-loop迭代时只读入一个 "行"?还是使用一个缓冲区,或者更糟糕的是在迭代之前读取整个文件?

我试图在阅读文档(https:/docs.python.org3librarycsv.html#csv.reader)中找到答案,甚至查找代码,但我找不到任何有用的信息。

答案

它是否只在每次for-loop迭代中读取 "行"?还是使用一个缓冲区,或者更糟糕的是在迭代之前读取整个文件?

正如文档中所说。csv.reader 会给你一个迭代器(reader对象)。

在你的例子中,你只是每次从这个迭代器中读取一行,所以你并没有把整个文件读到内存中。它调用了一个 __next__() 方法,当你迭代它时,一次给你每一行。

你可以从 迭代器:

一个代表数据流的对象。重复调用迭代器的 接下来()方法(或将其传递给内置函数next())返回流中的连续项目。

会导致你把整个文件读到内存中的是做这样的事情。

sample_reader = list(csv.reader(my_file))

# Loop over 1000 rows from list
for row in sample_reader[:num_rows]:
     # Do something with each line

这将耗尽迭代器,并将所有文件内容加载到一个列表中。这对于小文件来说是很好的,但是对于大文件(比如你的),像你现在做的那样从迭代器中一次只读一行要快得多。

另一答案

csv.reader 返回一个读取器对象,该对象调用 __next__ 方法的迭代器(在本例中是一个文件对象)。每次调用它,它都会返回文件对应行中的字符串列表。请注意,一旦它遍历文件,一旦它到达文件的末端。如果你想重设文件游标,可以使用 seek(0) (不建议)。

以上是关于Python - csv 阅读器 - 阅读一个样本。的主要内容,如果未能解决你的问题,请参考以下文章

CSV阅读器(Python)中的“行包含NULL字节”

阅读csv文件Anaconda | Python 3

python的csv阅读器可以留下引号吗?

Python CSV 阅读器将 Row 作为列表返回

加载csv文件s3 pyspark的随机样本

python csv阅读器的问题-对我的喜好不够严格