请教各位大神,我菜鸟 python 一枚,现在想读取一个超大的 csv 文件,不想每次从头读取,就需要个游标,这个怎么实现呢,万分感谢。。
1
mianju 2018-01-01 10:45:47 +08:00
|
2
yearliny 2018-01-01 11:12:57 +08:00 via Android
需要游标你就直接使用游标,不太懂你烦恼哪里
``` with open('data.csv'): f.seek(10)# 从第 11 行开始读取 c = csv.reader(f) for line in c: print(line) ``` |
4
bigeast 2018-01-01 12:04:23 +08:00 1
f.seek(10)是往后寻找 10 个字节,并不是 10 行。
可行的做法: import csv with open('test.csv','r') as f: for i in range(10): f.next() reader = csv.reader(f) for row in reader: print(row) 还有你游标是什么意思,csv 读取一次就到内存里了,你直接操作 reader 这个 list 就可以了啊。 |
5
bigeast 2018-01-01 12:05:07 +08:00
晕,v2ex 编辑太渣了吧,缩进给我吞了
|
7
bigeast 2018-01-01 13:19:49 +08:00
@psuwgipgf 按照每行平均 80 个字节,100G 的文本文件有 13.5 亿行。
如果你确定需要处理这么大的单独文本文件,首先产生这个文本文件的一方是需要提高姿势水平的。然后说具体做法,最简单的就是把文件分割啊。你要是觉得性能差可以自己去搞一套更高效的没人拦着你😏。 |
8
likuku 2018-01-01 13:23:06 +08:00
csv 之间先导入 db 吧,之后就随便搞了,节省资源?那就 sqlite
|
9
likuku 2018-01-01 13:24:00 +08:00
把文件当 db 用,拿就是要自己再造一个文件型 db 的轮子了...
|
10
diggerdu 2018-01-01 13:29:58 +08:00
pandas.read_csv
###END### |
11
jmc891205 2018-01-01 13:33:02 +08:00
上次读完之后用 f.tell()记一下读到哪里了 下次用 f.seek()直接挪过去
|
12
flog OP @yearliny 需要记录上次游标所在的位置,用 f.tell(),可是使用 for 循环读取内容相等于调用 next()方法,然后用 f.tell()会出错,怎么记录上次游标所在位置呢
|
15
zpole 2018-01-01 15:14:13 +08:00 via iPad
把 csv 存到数据库+1
|
16
omph 2018-01-01 15:35:45 +08:00
with open('data.csv') as f:
for line in f: print(line) |
17
yearliny 2018-01-01 15:44:27 +08:00 via Android
|