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
RicardoScofileld
V2EX  ›  Python

关于 pandas 读取文件的问题

  •  
  •   RicardoScofileld · 2018-05-19 12:12:53 +08:00 · 2558 次点击
    这是一个创建于 2141 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现有一个贼鸡儿大的文件,想要用 pandas 读取,文件是个是 str|str|str|str|str,用 pandas.read_table(path,header=None,sep='|')进行读取,但是文件里有一些脏数据,比如 str 中含有这|字符,所以用读取的时候老是异常,很蛋疼所以写了函数,进行处理,但是感觉好像有点蠢,各位大手子有没有什么别的方法。

    这个是处理异常的函数,文件有 4 个多 G,用我这种方式要读到猴年马月了

    def read_file(path):
        flag = True
        ignore_lines = []
        while flag:
            try:
                data = pd.read_table(path, header=None, sep='|', skiprows=ignore_lines)
            except Exception as e:
                error_line = re.search(r'line (\d+)', e.__str__()).group(1)
                ignore_lines.append(int(error_line))
            else:
                flag = Flase
        return data
    
    
    15 条回复    2018-05-19 17:05:08 +08:00
    vinceguo
        1
    vinceguo  
       2018-05-19 12:57:33 +08:00 via Android
    先把脏数据处理掉吧。先把分隔符个数不对的行挑出来写到别的地方,正确的行写到另一个地方
    alexfu
        2
    alexfu  
       2018-05-19 13:29:42 +08:00
    awk -F"|" 'NF==5{print}' file.txt

    可以用 subprocess 直接在 python 里读取结果
    RicardoScofileld
        3
    RicardoScofileld  
    OP
       2018-05-19 13:45:47 +08:00
    @vinceguo 主要数据量很大,百万条级别的。
    RicardoScofileld
        4
    RicardoScofileld  
    OP
       2018-05-19 13:46:24 +08:00
    @alexfu 是要对数据进行运算的
    jowuIM
        5
    jowuIM  
       2018-05-19 14:04:05 +08:00
    只能先对数据格式进行处理吧, 也就是把脏数据处理掉. 百万条但是却有 4G, 单挑数据应该不小.
    jssyxzy
        6
    jssyxzy  
       2018-05-19 15:06:13 +08:00
    感觉应该先处理;
    另外数据太大不考虑文件切割开来, 多开几个程序来读?
    vinceguo
        7
    vinceguo  
       2018-05-19 15:32:06 +08:00 via Android
    4G 数据能有多大。随便搞搞就好了。要相信电脑的速度
    zzj0311
        8
    zzj0311  
       2018-05-19 15:40:42 +08:00 via Android
    4g。。内存都不虚你虚什么
    airqj
        9
    airqj  
       2018-05-19 16:04:58 +08:00
    这么点数据用脚本处理再 pandas
    RicardoScofileld
        10
    RicardoScofileld  
    OP
       2018-05-19 16:31:40 +08:00
    @vinceguo 靠,文件 4g,读到内存都不止啊,我用 ipython,试着读取,直接进程都崩了
    RicardoScofileld
        11
    RicardoScofileld  
    OP
       2018-05-19 16:32:19 +08:00
    @airqj 处理个中间文件,在 pandas ?
    alexfu
        12
    alexfu  
       2018-05-19 16:43:37 +08:00
    @RicardoScofileld 先用 awk 处理再读进 pandas 啊
    kuhung
        13
    kuhung  
       2018-05-19 16:46:25 +08:00
    字符问题要考虑下怎么预处理。pandas 读大一点儿的数据,chunk 了解一下。
    alexfu
        14
    alexfu  
       2018-05-19 16:49:30 +08:00
    @RicardoScofileld 文件切分也可以直接一步做了 `awk -F"|" 'NF==5 && NR%5==1{print}' file.txt ` 这是 5 份中取一份
    janxin
        15
    janxin  
       2018-05-19 17:05:08 +08:00 via iPad
    pandas 如果不做处理,你这种纯字符串文件读出来的内存大小肯定是大于 4G,崩溃看一下是不是 oom,oom 那就是你能用的内存不够了呀

    你要做的不是 pandas 读的时候异常就再来一次,因为你的方法会不停尝试 load,建议你最好预处理数据即可,不要尝试反复 load,内存没释放最后也是 oom 了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2816 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:45 · PVG 19:45 · LAX 04:45 · JFK 07:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.