2014-11-03 91 views
1

我有一个名为myfile.txt的文本文件。该文件包含50,000行,我想将其分成50个文本文件。我知道拆分命令很简单:分割命令 - 选择输出名称

split myfile.txt 

这将输出50个1000行文件:xaa,xab和xac。

我的问题,我怎么跑分裂我的文本文件,以便它命名输出文件:在Python或bash

1.txt 
2.txt 
3.txt 

... 

50.txt 

寻找答案吧。谢谢!

回答

3

下面是一个使用itertools.islice拿到块和字符串格式化为不同的文件名潜在的解决方案:

from itertools import islice 

with open('myfile.txt') as in_file: 
    for i in range(1, 51): 
     with open('{0}.txt'.format(i), 'w') as out_file: 
      lines = islice(in_file, 1000) 
      out_file.writelines(lines) 
0

它不是你正在寻找什么,但运行

split -d myfile.txt 

会输出

x00 
x01 
x02 
... 
0

下面是如何分裂硫的例子在bash S档:

split -l 1000 -d --additional-suffix=.txt myfile.txt 

-l参数确定包括在每个划分的文件的行数(1000在这种情况下,50名总的文件)时,-d参数使用,而不是字母后缀的数字,并我们传递给--additional-suffix参数的值给每个文件一个.txt文件扩展名。

这将创建

x00.txt 
x01.txt 
x01.txt 

如果你想改变输出文件的“X”部分,你想要输入的文件后添加一个前缀(如myfile.txt f将创建f01.txt,f02.txt等)

请注意,如果没有--additional-suffix,您的文件将全部缺少文件扩展名。

我看过,看看有没有办法分割一个文件并命名为只有的后缀,但我还没有找到任何东西。

1

为了生成空目录的测试数据,可以使用

seq 50000 | split -d 

要在你希望的方式重新命名,你可以使用

ls x* | awk '{print $0, (substr($0,2)+1) ".txt"}' | xargs -n2 mv 
-1

一个简单的方法:

f=open('your_file') 
count_line,file = 0,1 
for x in f: 
    count_line +=1 
    if count%1000 == 1: 
     f1 = open(str(file) + '.txt','w') 
     f1.write(x) 
     file +=1 
    elif count_line%1000 == 0: 
     f1.write(x) 
     f1.close() 
    else:f1.write(x) 
+0

任何原因,所以我可以纠正我错在哪里? – Hackaholic 2014-11-03 23:21:38

+0

不是我的失望,但是否这个工作,这是写得很差的代码。 – 2014-11-04 18:38:21

1

这里有一个有趣的例子:如果您的split命令支持--filter选项,您可以se it!

如果你打电话

split --filter=./banana myfile.txt 

然后命令./banana将与环境变量FILE集执行的名称split会选择写它的处理块。该命令将在其标准输入中接收正在处理的块。如果此命令返回非零状态码,则拆分将中断其操作。

加上-d选项,这正是你想要的。随着-d选项,名称拆分为文件名会选择将x01x02

使脚本:

#!/bin/bash 

# remove the leading x from FILE 
n=${FILE#x} 
# check that n is a number 
[[ $n = +([[:digit:]]) ]] || exit 1 
# remove the leading zeroes from n 
n=$((10#$n)) 

# send stdin to file 
cat > "$n.txt" 

调用此脚本bananachmod +x它,让我们去:

split -d --filter=./banana myfile.txt 

这个--filter选项真的很有趣。

+0

什么版本支持'--filter'?它似乎不支持Mac OS X 10.10附带的BSD'split'或GNU coreutils 8.4附带的GNU'split'。 – chepner 2014-11-03 21:58:04

+0

@chepner'split(GNU coreutils)8.21'。我刚刚通过阅读'man'页面发现了这个时髦的选项。漂亮的把戏。 – 2014-11-03 22:00:34