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

怎么用 python 把 1w 个 txt 文件平均分到 100 个文件夹中?

  •  
  •   POP · 2015-01-09 12:49:03 +08:00 · 5924 次点击
    这是一个创建于 3638 天前的主题,其中的信息可能已经有所发展或是发生改变。
    怎么用python把1w个txt文件平均分到100个文件夹中?
    21 条回复    2015-01-11 03:22:06 +08:00
    mengzhuo
        1
    mengzhuo  
       2015-01-09 13:46:51 +08:00   ❤️ 1
    enumerate 每个文件
    按100取模分配
    移动文件
    搞定
    beordle
        2
    beordle  
       2015-01-09 13:49:20 +08:00   ❤️ 1
    [move(index%100,filename) for index,filename in enumerate(list(glob.glob('*.txt')))]
    laotaitai
        3
    laotaitai  
       2015-01-09 15:36:08 +08:00
    @beordle
    牛叉! 不过我更感兴趣的是move函数你怎么写? index>=100的时候, 你该咋办? move怎么知道是第二轮, 第三轮, 第四轮了?
    expkzb
        4
    expkzb  
       2015-01-09 15:42:03 +08:00   ❤️ 1
    @laotaitai 取模为0自动进入下一轮?
    laotaitai
        5
    laotaitai  
       2015-01-09 15:54:40 +08:00
    @expkzb
    move函数怎么知道是第几轮呢? 我看, 还是应该把index也传进去为好, 或者告诉move是第几轮了.
    beordle
        6
    beordle  
       2015-01-09 16:07:35 +08:00
    @laotaitai 不用知道是低幾輪就能有需要的效果吧
    先os.mkdir建立好100個文件夾
    move=lambda i,n:shutil.move(n,os.path.join(str(n),n))
    KentY
        7
    KentY  
       2015-01-09 16:09:20 +08:00 via iPhone
    awk 就一行能搞定
    beordle
        8
    beordle  
       2015-01-09 16:09:22 +08:00
    @laotaitai str (n) 里應該是 i 打錯了
    beordle
        9
    beordle  
       2015-01-09 16:10:12 +08:00
    @KentY 哈哈我也是一行搞定的呀~同是天津人哈
    KentY
        10
    KentY  
       2015-01-09 16:12:37 +08:00 via iPhone
    @beordle 原来是python节点,以为是程序员了,添乱了。awk很善于做这种事。
    我哪写我是天津人啦
    ibigbug
        11
    ibigbug  
       2015-01-09 16:13:16 +08:00
    @KentY 请教
    KentY
        12
    KentY  
       2015-01-09 16:15:40 +08:00 via iPhone   ❤️ 1
    @ibigbug 我到公司后发,拿手机不好写
    beordle
        13
    beordle  
       2015-01-09 16:56:16 +08:00
    @KentY 看錯了 *_*
    KentY
        14
    KentY  
       2015-01-09 16:57:49 +08:00 via Android
    @beordle 我真是 嘿嘿,你看错了,蒙对了
    beordle
        15
    beordle  
       2015-01-09 17:04:49 +08:00
    @KentY :)
    KentY
        16
    KentY  
       2015-01-09 17:27:53 +08:00   ❤️ 3
    ## quick and dirty

    find or ls...|awk 'NR%100==1{t="/dest"++i}$0="mv " $0 " " t'|sh

    - 假设你那些文件用ls/find找到
    - 去掉最后的`|sh`可以显示生成的mv命令,并不执行
    - 这个会mv你那些文件到dest1-dest1000目录。

    用seq模拟下10个文件,每2个存到相应目录:

    kent$ seq -f "%g.txt" 10|awk 'NR%2==1{t="/dest"++i}$0="mv " $0 " " t'
    mv 1.txt /dest1
    mv 2.txt /dest1
    mv 3.txt /dest2
    mv 4.txt /dest2
    mv 5.txt /dest3
    mv 6.txt /dest3
    mv 7.txt /dest4
    mv 8.txt /dest4
    mv 9.txt /dest5
    mv 10.txt /dest5

    ##Better version

    前面那个quick and dirty, dirty在于,很多写死的东西,而且文件名有空格什么的会有问题,这个比上一个文件长,但是好一些,也一行:

    ...|awk -v q='"' -v dest="/dest" -v g="100" 'NR%g==1{t=dest"" ++i}{printf "mv %s %s\n", q$0q,q t q}'|sh

    这个`dest` 参数可以制定,每多少个`g`参数也是活的,文件名都用引号括了,同样用seq模拟:

    kent$ seq -f "%g.txt" 10|awk -v q='"' -v dest="/dest" -v g="2" 'NR%g==1{t=dest"" ++i}{printf "mv %s %s\n", q$0q,q t q}'
    mv "1.txt" "/dest1"
    mv "2.txt" "/dest1"
    mv "3.txt" "/dest2"
    mv "4.txt" "/dest2"
    mv "5.txt" "/dest3"
    mv "6.txt" "/dest3"
    mv "7.txt" "/dest4"
    mv "8.txt" "/dest4"
    mv "9.txt" "/dest5"
    mv "10.txt" "/dest5"
    KentY
        17
    KentY  
       2015-01-09 17:28:37 +08:00
    @ibigbug
    @beordle
    发上面了, 回复过的文字不能修改?
    cszhiyue
        18
    cszhiyue  
       2015-01-09 17:34:38 +08:00
    @KentY 是的.
    KDr2
        19
    KDr2  
       2015-01-09 17:51:19 +08:00   ❤️ 1
    perl -pe 'if(!(int($.%100)-1)) {open(FH, ">xxx.@{[int($./100)]}.txt"); select FH;}' data.txt
    KDr2
        20
    KDr2  
       2015-01-09 20:14:57 +08:00
    擦,竟然看错了题目,以为分一个1w行的文件成100个文件。。。
    ryd994
        21
    ryd994  
       2015-01-11 03:22:06 +08:00 via Android
    为什么我先想到的是用python生成参数序列然后xargs mv么……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3077 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:29 · PVG 21:29 · LAX 05:29 · JFK 08:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.