V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
flog
V2EX  ›  Python

Python csv 读取

  •  
  •   flog · 2018-01-01 10:34:42 +08:00 · 3704 次点击
    这是一个创建于 2548 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    17 条回复    2018-01-01 15:44:27 +08:00
    yearliny
        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)
    ```
    yearliny
        3
    yearliny  
       2018-01-01 11:13:42 +08:00 via Android
    @yearliny with open('data.csv') as f:
    bigeast
        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 就可以了啊。
    bigeast
        5
    bigeast  
       2018-01-01 12:05:07 +08:00
    晕,v2ex 编辑太渣了吧,缩进给我吞了
    psuwgipgf
        6
    psuwgipgf  
       2018-01-01 12:10:55 +08:00
    @bigeast 请问如果是 100G 的文件也可以这样操作吗?
    bigeast
        7
    bigeast  
       2018-01-01 13:19:49 +08:00
    @psuwgipgf 按照每行平均 80 个字节,100G 的文本文件有 13.5 亿行。

    如果你确定需要处理这么大的单独文本文件,首先产生这个文本文件的一方是需要提高姿势水平的。然后说具体做法,最简单的就是把文件分割啊。你要是觉得性能差可以自己去搞一套更高效的没人拦着你😏。
    likuku
        8
    likuku  
       2018-01-01 13:23:06 +08:00
    csv 之间先导入 db 吧,之后就随便搞了,节省资源?那就 sqlite
    likuku
        9
    likuku  
       2018-01-01 13:24:00 +08:00
    把文件当 db 用,拿就是要自己再造一个文件型 db 的轮子了...
    diggerdu
        10
    diggerdu  
       2018-01-01 13:29:58 +08:00
    pandas.read_csv
    ###END###
    jmc891205
        11
    jmc891205  
       2018-01-01 13:33:02 +08:00
    上次读完之后用 f.tell()记一下读到哪里了 下次用 f.seek()直接挪过去
    flog
        12
    flog  
    OP
       2018-01-01 15:05:56 +08:00
    @yearliny 需要记录上次游标所在的位置,用 f.tell(),可是使用 for 循环读取内容相等于调用 next()方法,然后用 f.tell()会出错,怎么记录上次游标所在位置呢
    flog
        13
    flog  
    OP
       2018-01-01 15:07:12 +08:00
    @bigeast 还真的就差不多那么大的文件,而且源文件一天内不是固定时间段写入,就还得用到增量读取。
    flog
        14
    flog  
    OP
       2018-01-01 15:08:06 +08:00
    @jmc891205 csv 模块,使用 for 循环后,调用 tell()方法,会出错,有什么解决办法吗
    zpole
        15
    zpole  
       2018-01-01 15:14:13 +08:00 via iPad
    把 csv 存到数据库+1
    omph
        16
    omph  
       2018-01-01 15:35:45 +08:00
    with open('data.csv') as f:
    for line in f:
    print(line)
    yearliny
        17
    yearliny  
       2018-01-01 15:44:27 +08:00 via Android
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5766 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 06:32 · PVG 14:32 · LAX 22:32 · JFK 01:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.