我有一个名为myfile.txt
的文本文件。该文件包含50,000行,我想将其拆分为50个文本文件。我知道使用split命令很容易:
split myfile.txt
这将输出50个1000行文件:xaa,xab和xac。
我的问题是,如何运行拆分文本文件以便命名输出文件:
1.txt
2.txt
3.txt
...
50.txt
请在python或bash中寻求答案。谢谢!
答案 0 :(得分: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)
答案 1 :(得分:1)
要在空目录中生成测试数据,可以使用
seq 50000 | split -d
要以您想要的方式重命名,您可以使用
ls x* | awk '{print $0, (substr($0,2)+1) ".txt"}' | xargs -n2 mv
答案 2 :(得分:1)
这是一个有趣的问题:如果您的split
命令支持--filter
选项,则可以使用它!
如果你打电话
split --filter=./banana myfile.txt
然后将执行命令./banana
,并将设置为名称FILE
的环境变量split
选择写入它正在处理的块。此命令将在其标准输入上接收正在处理的块。如果此命令返回非零状态代码,则split将中断其操作。
与-d
选项一起,这正是您想要的。使用-d
选项,名称拆分将选择文件名为x01
,x02
等。
制作剧本:
#!/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"
请调用此脚本banana
,chmod +x
,然后转:
split -d --filter=./banana myfile.txt
这个--filter
选项非常有趣。
答案 3 :(得分:0)
它不是你想要的,而是正在运行
split -d myfile.txt
将输出
x00
x01
x02
...
答案 4 :(得分:0)
以下是如何在bash中分割此文件的示例:
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
,您的文件都将缺少文件扩展名。
我看看有没有办法拆分文件并用仅后缀命名,但我没有找到任何东西。
答案 5 :(得分:-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)