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

Python 如何按照行来分割大文件。

  •  
  •   AlisaDestiny · 2017-01-01 19:08:20 +08:00 · 6583 次点击
    这是一个创建于 2912 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在有一个文件有一百多万条数据,按行存储的。 100 多 M ,文本类型的。我想分割成小文件。每个文件 10000 行。想问下各位大神有没有解决办法。或者有代码就更好了。

    第 1 条附言  ·  2017-01-01 22:59:22 +08:00
    感谢大家。问题成功解决了。我也成功进入了邻居家的路由器管理界面。哈哈哈。

    我说的大文件实际上是一个常用密码集合。少的密码文件 有 100 多 M 。多的文件有压缩包有 1G 多。

    最后,还是感谢大家。
    24 条回复    2017-01-03 11:08:05 +08:00
    ipwx
        1
    ipwx  
       2017-01-01 19:16:30 +08:00
    100M 这个还需要问大神…… 老老实实地边读边写不就行了,时间都在 IO 上不在运算上, Python 绰绰有余。

    哦对了,最好是读写的两个文件在两块硬盘上,不然就很慢了。
    z657386160z
        2
    z657386160z  
       2017-01-01 19:25:25 +08:00 via iPhone
    split -l
    skydiver
        3
    skydiver  
       2017-01-01 19:28:35 +08:00
    这种事情还需要用 Python ?直接 coreutils 自带的命令 split -l 10000 就可以了。
    484A4B
        4
    484A4B  
       2017-01-01 19:29:00 +08:00
    如果不限定 Python 的话,用 shell 一行就够了
    ipwx
        5
    ipwx  
       2017-01-01 19:29:27 +08:00   ❤️ 1
    AlisaDestiny
        6
    AlisaDestiny  
    OP
       2017-01-01 19:35:05 +08:00
    @ipwx
    如果把这一百多万行数据读到内存中用 split 分成一百多万行,我担心程序会崩~~

    @z657386160z
    @skydiver
    @484A4B
    哎。关键是是 window 系统。没有 split 命令。 QAQ
    AlisaDestiny
        7
    AlisaDestiny  
    OP
       2017-01-01 19:36:45 +08:00
    @ipwx thank you very much.
    Lpl
        8
    Lpl  
       2017-01-01 19:48:19 +08:00 via Android
    长春儿~?
    v23ex
        9
    v23ex  
       2017-01-01 19:51:48 +08:00 via iPhone
    先在本地测试
    Izual_Yang
        10
    Izual_Yang  
       2017-01-01 20:17:02 +08:00 via Android
    guyskk
        11
    guyskk  
       2017-01-01 20:35:12 +08:00 via Android
    100M 不大,全部读进内存没事的
    ericls
        12
    ericls  
       2017-01-01 20:37:14 +08:00 via iPhone
    @AlisaDestiny Python 不会全部读进内存吧……
    billlee
        13
    billlee  
       2017-01-01 20:49:48 +08:00
    你为什么要全部读进内存,一行行读不行吗?
    ryd994
        14
    ryd994  
       2017-01-01 20:54:42 +08:00 via Android
    莫不是 PHP 程序员?
    这么大的文件我担心程序会崩 233333

    用个 for 就搞定的事
    或者 head 配合 tail ,根本不需要 Python
    jyf007
        15
    jyf007  
       2017-01-01 20:58:39 +08:00 via Android
    split -l 10000
    什么 用 Python
    我不知道
    jyf007
        16
    jyf007  
       2017-01-01 20:59:11 +08:00 via Android
    @AlisaDestiny msys2 (滑稽)
    kankana
        17
    kankana  
       2017-01-01 22:27:26 +08:00
    @ryd994

    php 可以用 fopen, fgets, fclose 这些函数啊。不会整个读到内存的。。。
    AlisaDestiny
        18
    AlisaDestiny  
    OP
       2017-01-01 22:41:34 +08:00
    @Lpl guess right.哈哈。
    RqPS6rhmP3Nyn3Tm
        19
    RqPS6rhmP3Nyn3Tm  
       2017-01-01 22:42:58 +08:00 via iPhone
    Readline 读取至内存,然后写入不好吗
    AlisaDestiny
        20
    AlisaDestiny  
    OP
       2017-01-01 22:54:45 +08:00
    @guyskk 确实。我按照上面别人给的代码执行。任务管理器中内存看不出变化。就是 CPU 高了。

    @billlee 初学者,就是不知道怎么多次读才来请教的。

    @ryd994 把文件分成块并不是最终目的。所以我需要用程序来解决。
    Miy4mori
        21
    Miy4mori  
       2017-01-02 01:32:14 +08:00 via Android
    兄弟,学学流的概念吧,处理文件要都读内存里全世界都要疯啊
    qile1
        22
    qile1  
       2017-01-03 04:10:47 +08:00 via Android
    f 。 readlines()
    araraloren
        23
    araraloren  
       2017-01-03 08:55:38 +08:00
    @AlisaDestiny 自带的行读取函数大部分时候够用,大概是类似与 .readlines 之类的函数,我估计会做惰性处理,再说哪个用户会在乎那几百 M 内存。。
    kevin8096
        24
    kevin8096  
       2017-01-03 11:08:05 +08:00
    awk
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   880 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:57 · PVG 05:57 · LAX 13:57 · JFK 16:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.