閱讀289 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Python實現簡單文本分割工具

Python處理單個大文本文件時可能耗時較長而且多線程對單個文件的操作也要處理死鎖等,對文件進行分割然後對分割後的文件進行多進程+多線程分別處理是一個不錯的思路。

文 章分割可以按體積分割,也可以按行進行分割,一般情況下按行分割能保證數據的完整性,所以本腳本以按行分割實現,運行時,被分割文件和腳本位於同一目錄, 運行後先輸入被分割的文件全名,然後輸入分割的數量,再輸入輸出的文件前綴就可以了!因為時間倉促,還有幾個小bug沒有修改!

源代碼:基於Python2.7,盡量不使用各種庫

      支持格式:txt  sql  json  csv  xml  log等常見的有明顯結構的文本文件



#coding=utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

def get_file():#獲取被分割的文件名,並驗證是否合法
    while(True):
	f_name=raw_input('[ * ] Please input the filename to div: ')
	if isinstance(f_name,str):
	    if f_name.find('.txt')>0 or f_name.find('.sql')>0 or f_name.find('.json')>0 or f_name.find('.csv')>0 or f_name.find('.xml')>0 or f_name.find('.log')>0:				
		return f_name
	    else:
	        print '[ * ]The format Error!!!'
	        pass
	else: 
	    print '[ * ]The format Error!!!'
	    pass

def get_int():#獲取要分割成幾份文件
    while(True):
	file_num=raw_input('[ * ] Please input numbers: ')
	file_num=int(file_num)
	if isinstance(file_num,int):
	    return file_num
        else: 
	    print '[ * ]The number Error!'
	    continue

def get_allines(file_name):#統計文本文件所有的行數
    i=0
    with open(file_name) as f:
	for j in f:
	  i=i+1
    return i
	
if __name__=='__main__':
	print
	print '------------------------------------------------'
	print '[ * ] Filetype:txt sql csv xml json log'
	print '------------------------------------------------'
	print
	file_to_div=get_file()
	dot=file_to_div.find('.')
	houzui=file_to_div[dot:]
	outfile_name=raw_input('[ * ] Please input file-prifix:  ')#獲取輸出文件的文件名前綴
	num=get_int()
	lines_num=get_allines(file_to_div)
	print str(num)+' files ---',str(lines_num)+' lines per file'#打印
	mid=lines_num/num#獲取分割後每份文件應該多少行,因為整數除法所以輸出的文件數目可能多一個,下行處理
	mid=mid+1#為每個文件多加一行,防止輸出的文件的數量多一個
	
	i=0
	with open(file_to_div) as file_hander:
	    for line in file_hander:
		i=i+1
		filename=outfile_name+str(i/mid+1)+houzui
		with open(filename,'a') as wfile:
		wfile.write(line)
	print
	print 'finished!!!'

使用示例:

step 1:輸入被分割的文件名,如"mem.sql"

step 2:輸入分割後的文件名的前綴,如"out"

step 3:輸入分割的文件數目,如 4

Clipboard Image.png

補充:如果想利用本腳本處理其他格式的文本文件,可以在獲取被分割的文件名函數裏修改即可。

第一次發文章,路過的大神勿噴,Python學習交流使用,方便大家以後處理文本


最後更新:2017-04-20 21:00:31

  上一篇:go 測試
  下一篇:go DIY圖像壓縮——機器學習實戰之K-means 聚類圖像壓縮:色彩量化