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

2015-01-09 12:49:03 +08:00
 POP
怎么用python把1w个txt文件平均分到100个文件夹中?
5902 次点击
所在节点    Python
21 条回复
mengzhuo
2015-01-09 13:46:51 +08:00
enumerate 每个文件
按100取模分配
移动文件
搞定
beordle
2015-01-09 13:49:20 +08:00
[move(index%100,filename) for index,filename in enumerate(list(glob.glob('*.txt')))]
laotaitai
2015-01-09 15:36:08 +08:00
@beordle
牛叉! 不过我更感兴趣的是move函数你怎么写? index>=100的时候, 你该咋办? move怎么知道是第二轮, 第三轮, 第四轮了?
expkzb
2015-01-09 15:42:03 +08:00
@laotaitai 取模为0自动进入下一轮?
laotaitai
2015-01-09 15:54:40 +08:00
@expkzb
move函数怎么知道是第几轮呢? 我看, 还是应该把index也传进去为好, 或者告诉move是第几轮了.
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
2015-01-09 16:09:20 +08:00
awk 就一行能搞定
beordle
2015-01-09 16:09:22 +08:00
@laotaitai str (n) 里應該是 i 打錯了
beordle
2015-01-09 16:10:12 +08:00
@KentY 哈哈我也是一行搞定的呀~同是天津人哈
KentY
2015-01-09 16:12:37 +08:00
@beordle 原来是python节点,以为是程序员了,添乱了。awk很善于做这种事。
我哪写我是天津人啦
ibigbug
2015-01-09 16:13:16 +08:00
@KentY 请教
KentY
2015-01-09 16:15:40 +08:00
@ibigbug 我到公司后发,拿手机不好写
beordle
2015-01-09 16:56:16 +08:00
@KentY 看錯了 *_*
KentY
2015-01-09 16:57:49 +08:00
@beordle 我真是 嘿嘿,你看错了,蒙对了
beordle
2015-01-09 17:04:49 +08:00
@KentY :)
KentY
2015-01-09 17:27:53 +08:00
## 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
2015-01-09 17:28:37 +08:00
@ibigbug
@beordle
发上面了, 回复过的文字不能修改?
cszhiyue
2015-01-09 17:34:38 +08:00
@KentY 是的.
KDr2
2015-01-09 17:51:19 +08:00
perl -pe 'if(!(int($.%100)-1)) {open(FH, ">xxx.@{[int($./100)]}.txt"); select FH;}' data.txt
KDr2
2015-01-09 20:14:57 +08:00
擦,竟然看错了题目,以为分一个1w行的文件成100个文件。。。

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

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

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

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

© 2021 V2EX