首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用python仅读取csv文件中的某些行

使用python仅读取csv文件中的某些行
EN

Stack Overflow用户
提问于 2019-05-22 21:51:27
回答 4查看 16.4K关注 0票数 1

我只想从csv文件中的某一行开始读取一定数量的行,而不是在整个csv文件中迭代来达到这一点。

假设我有一个包含100行的csv文件,并且我只想读取第50到60行。我不想从第1行迭代到第49行,直到第50行才开始读取。我能用seek()实现这一点吗?

例如: Seek to row 50 read from 50 to 60

下一次:查找第27行,读取27到34,依此类推

因此,不仅在整个文件中继续向前查找,而且还向后查找。

非常感谢

EN

回答 4

Stack Overflow用户

发布于 2019-05-22 21:57:13

一种选择是使用Pandas。例如:

代码语言:javascript
复制
import pandas as pd
# Select file 
infile = r'path/file'
# Use skiprows to choose starting point and nrows to choose number of rows
data = pd.read_csv(infile, skiprows = 50, nrows=10)
票数 6
EN

Stack Overflow用户

发布于 2019-05-22 21:57:05

您可以使用chunksize

代码语言:javascript
复制
import pandas as pd

chunksize = 10 ** 6
for chunk in pd.read_csv(filename, chunksize=chunksize):
    process(chunk)
票数 4
EN

Stack Overflow用户

发布于 2019-05-22 22:29:25

如果列数/行长是可变的,那么如果不“读取”(即,处理)文件中之前的每个字符,并计算行终止符,就不可能找到您想要的行。在python中处理它们的最快方法是使用迭代。

至于处理大文件的最快方法,我不知道这样逐行迭代是否更快:

代码语言:javascript
复制
with open(file_name) as f:
    for line,_ in zip(f, range(50)):
        pass
    lines = [line for line,_ in zip(f, range(10))]

使用seek一次读取一个字符并计算换行符的...or。但是做第一件事肯定要方便得多。

但是,如果文件被大量读取,那么随着时间的推移,遍历各行将变得很慢。如果文件内容没有更改,您可以通过读取整个文件一次并提前构建行长度的dict来完成此操作:

代码语言:javascript
复制
from itertools import accumulate
with open(file_name) as f:
    cum_lens = dict(enumerate(accumulate(len(line) for line in f), 1))

这将允许您查找文件中的任何行号,而无需再次处理整个内容:

代码语言:javascript
复制
def seek_line(path, line_num, cum_lens):
    with open(path) as f:
        f.seek(cum_lens[line_num], 0)
        return f.readline()

class LineX:
    """A file reading object that can quickly obtain any line number."""
    def __init__(self, path, cum_lens):
        self.cum_lens = cum_lens
        self.path = path
    def __getitem__(self, i):
        return seek_line(self.path, i, self.cum_lens)

linex = LineX(file_name, cum_lens)
line50 = linex[50]

但在这一点上,最好将文件内容加载到某种数据库中。这取决于您正在尝试做什么,以及文件包含的数据类型。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56258448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档