想发财的打火机 · OkHttpClient client = ...· 3 周前 · |
老实的刺猬 · VBA激活Activate用法_vba ...· 2 月前 · |
体贴的鸡蛋面 · exp时遇到ora-932错误,然后异常终止 ...· 4 月前 · |
空虚的花卷 · android ...· 10 月前 · |
瘦瘦的大熊猫 · 将「Java ...· 11 月前 · |
我只想从csv文件 中的某一行开始读取一定数量的行,而不是在整个csv文件中迭代 来达到这一点。
假设我有一个包含100行的csv文件,并且我只想读取第50到60行。我不想从第1行迭代到第49行,直到第50行才开始读取。我能用seek()实现这一点吗?
例如: Seek to row 50 read from 50 to 60
下一次:查找第27行,读取27到34,依此类推
因此,不仅在整个文件中继续向前查找,而且还向后查找。
非常感谢
您可以使用 chunksize
import pandas as pd
chunksize = 10 ** 6
for chunk in pd.read_csv(filename, chunksize=chunksize):
process(chunk)
一种选择是使用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)
如果列数/行长是可变的,那么如果不“读取”(即,处理)文件中之前的每个字符,并计算行终止符,就不可能找到您想要的行。在python中处理它们的最快方法是使用迭代。
至于处理大文件的最快方法,我不知道这样逐行迭代是否更快:
with open(file_name) as f:
for line,_ in zip(f, range(50)):
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