python實現文字檔合并

來源:互聯網
上載者:User
python合并文字檔範例程式碼。

python實現兩個文本合并

employee檔案中記錄了工號和姓名

cat employee.txt:

100 Jason Smith200 John Doe300 Sanjay Gupta400 Ashok Sharma

bonus檔案中記錄工號和工資

cat bonus.txt:

100 $5,000200 $500300 $3,000400 $1,250

要求把兩個檔案合并並輸出如下, 處理結果:

400 ashok sharma $1,250100 jason smith $5,000200 john doe $500300 sanjay gupta $3,000

這個應該是要求用shell來寫的,但我的shell功底不怎麼樣,就用python來實現了
注意,按題目的意思,在輸出檔案中還需要按照姓名首字母來排序的

#! /usr/bin/env python #coding=utf-8fp01=open("bonus.txt","r")a=[]for line01 in fp01:a.append(line01)fp02=open("employee.txt","r")fc02=sorted(fp02,key=lambda x:x.split()[1])for line02 in fc02:i=0while line02.split()[0]!=a[i].split()[0]:i+=1print "%s %s %s %s" % (line02.split()[0],line02.split()[1],line02.split()[2],a[i].split()[1])fp01.close()fp02.close()

我們再來看一段同樣功能的 代碼

# coding gbk # # author: GreatGhoul # email : greatghoul@gmail.com # blog : http://greatghoul.javaeye.com   import sys,os,msvcrt   def join(in_filenames, out_filename):   out_file = open(out_filename, 'w+')       err_files = []   for file in in_filenames:     try:       in_file = open(file, 'r')       out_file.write(in_file.read())       out_file.write('\n\n')       in_file.close()     except IOError:       print 'error joining', file       err_files.append(file)   out_file.close()   print 'joining completed. %d file(s) missed.' % len(err_files)   print 'output file:', out_filename   if len(err_files) > 0:     print 'missed files:'     print '--------------------------------'     for file in err_files:       print file     print '--------------------------------'   if __name__ == '__main__':   print 'scanning...'   in_filenames = []   file_count = 0   for file in os.listdir(sys.path[0]):     if file.lower().endswith('[all].txt'):       os.remove(file)     elif file.lower().endswith('.txt'):       in_filenames.append(file)       file_count = file_count + 1   if len(in_filenames) > 0:     print '--------------------------------'     print '\n'.join(in_filenames)     print '--------------------------------'     print '%d part(s) in total.' % file_count     book_name = raw_input('enter the book name: ')     print 'joining...'     join(in_filenames, book_name + '[ALL].TXT')   else:     print 'nothing found.'   msvcrt.getch()

最後我們再來看一個小編遇到的情況:

今天彙編的時候在阿甘的部落格裡面看到了一部小說《瘋狂的程式員》,於是網上搜了下準備放到手機裡閑時看看,無奈下載後發現是分章節的txt文本,一共有87個檔案,考慮到閱讀起來不是很方便,於是想找個現成的工具合并txt文本。

結果嘗試了幾個工具後覺得合并效果都不給力啊,於是打算自己動手。其實cmd的命令"type *.txt >> crazy-programmer.txt"還是很有效果的,然而合并後的txt檔案卻十分龐大,所以我還是自己寫了一個指令碼完成了合并。

說明:由於我下載的87個txt檔案的字元編碼格式都不統一,所以我用chardet模組判斷字元編碼類型後再用codecs模組的codecs.open功能解決了編碼問題。如果直接用file的open開啟txt檔案的話,在UCS-2 Little Endian的編碼情況下,file.read()遇到中文的冒號(即“:”)後會無法讀取冒號以後的內容,所以需要用codecs.open(path,'r',encoding)來解決。

如果還有問題可以留言,代碼如下:

#!coding: cp936 import codecs, chardet  def fileopen(filename):   f = open(filename, 'r')   s = f.read()   if(chardet.detect(s)['encoding'] == 'UTF-16LE'):     f.close()     f = codecs.open(filename, 'r', 'utf-16-le')         data = f.read().encode('gb2312', 'ignore')     f.close()   elif(chardet.detect(s)['encoding'] == 'GB2312'):     data = s     f.close()   return data  i = 1 while i <=87:   if(i < 10):     filename = '0'+str(i)+'.txt'   else:     filename = str(i)+'.txt'   text = fileopen(filename)   file('crazy-p.txt', 'a+').write(text)   i = i+1 

其中,chardet模組需要下載安裝,指令碼還可以改進以適應更多種情況,我就懶了。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.