Python csv 读取

2018-01-01 10:34:42 +08:00
 flog

请教各位大神,我菜鸟 python 一枚,现在想读取一个超大的 csv 文件,不想每次从头读取,就需要个游标,这个怎么实现呢,万分感谢。。

3704 次点击
所在节点    Python
17 条回复
mianju
2018-01-01 10:45:47 +08:00
yearliny
2018-01-01 11:12:57 +08:00
需要游标你就直接使用游标,不太懂你烦恼哪里
```
with open('data.csv'):
f.seek(10)# 从第 11 行开始读取
c = csv.reader(f)
for line in c:
print(line)
```
yearliny
2018-01-01 11:13:42 +08:00
@yearliny with open('data.csv') as f:
bigeast
2018-01-01 12:04:23 +08:00
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 就可以了啊。
bigeast
2018-01-01 12:05:07 +08:00
晕,v2ex 编辑太渣了吧,缩进给我吞了
psuwgipgf
2018-01-01 12:10:55 +08:00
@bigeast 请问如果是 100G 的文件也可以这样操作吗?
bigeast
2018-01-01 13:19:49 +08:00
@psuwgipgf 按照每行平均 80 个字节,100G 的文本文件有 13.5 亿行。

如果你确定需要处理这么大的单独文本文件,首先产生这个文本文件的一方是需要提高姿势水平的。然后说具体做法,最简单的就是把文件分割啊。你要是觉得性能差可以自己去搞一套更高效的没人拦着你😏。
likuku
2018-01-01 13:23:06 +08:00
csv 之间先导入 db 吧,之后就随便搞了,节省资源?那就 sqlite
likuku
2018-01-01 13:24:00 +08:00
把文件当 db 用,拿就是要自己再造一个文件型 db 的轮子了...
diggerdu
2018-01-01 13:29:58 +08:00
pandas.read_csv
###END###
jmc891205
2018-01-01 13:33:02 +08:00
上次读完之后用 f.tell()记一下读到哪里了 下次用 f.seek()直接挪过去
flog
2018-01-01 15:05:56 +08:00
@yearliny 需要记录上次游标所在的位置,用 f.tell(),可是使用 for 循环读取内容相等于调用 next()方法,然后用 f.tell()会出错,怎么记录上次游标所在位置呢
flog
2018-01-01 15:07:12 +08:00
@bigeast 还真的就差不多那么大的文件,而且源文件一天内不是固定时间段写入,就还得用到增量读取。
flog
2018-01-01 15:08:06 +08:00
@jmc891205 csv 模块,使用 for 循环后,调用 tell()方法,会出错,有什么解决办法吗
zpole
2018-01-01 15:14:13 +08:00
把 csv 存到数据库+1
omph
2018-01-01 15:35:45 +08:00
with open('data.csv') as f:
for line in f:
print(line)
yearliny
2018-01-01 15:44:27 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/419107

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX