2014-11-03 89 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