我只想从csv文件中的某一行开始读取一定数量的行,而不是在整个csv文件中迭代来达到这一点。
假设我有一个包含100行的csv文件,并且我只想读取第50到60行。我不想从第1行迭代到第49行,直到第50行才开始读取。我能用seek()实现这一点吗?
例如: Seek to row 50 read from 50 to 60
下一次:查找第27行,读取27到34,依此类推
因此,不仅在整个文件中继续向前查找,而且还向后查找。
非常感谢
发布于 2019-05-22 21:57:13
一种选择是使用Pandas。例如:
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)
发布于 2019-05-22 21:57:05
您可以使用chunksize
import pandas as pd
chunksize = 10 ** 6
for chunk in pd.read_csv(filename, chunksize=chunksize):
process(chunk)
发布于 2019-05-22 22:29:25
如果列数/行长是可变的,那么如果不“读取”(即,处理)文件中之前的每个字符,并计算行终止符,就不可能找到您想要的行。在python中处理它们的最快方法是使用迭代。
至于处理大文件的最快方法,我不知道这样逐行迭代是否更快:
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
来完成此操作:
from itertools import accumulate
with open(file_name) as f:
cum_lens = dict(enumerate(accumulate(len(line) for line in f), 1))
这将允许您查找文件中的任何行号,而无需再次处理整个内容:
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]
但在这一点上,最好将文件内容加载到某种数据库中。这取决于您正在尝试做什么,以及文件包含的数据类型。
https://stackoverflow.com/questions/56258448
复制相似问题