2013-02-28 87 views
0

我需要幫助解析文本文件,該文件是這樣的:提取變量的值寫入CSV與蟒蛇

WKU 03487472 
WKU 3487472 
     Filed Apr. 30, 1968, Ser. No. 725,329 
     Int. Cl. A42b 1122 
AISD 19700106 
WKU D2487471 
AISD 19700308 
WKU 03487471 
     Filed J 16, 1969 
     [51] Int. Cl. A41d 25104 
AISD 19700106 

我想獲得一些輸出CSV格式爲:

WKU   Filed    Int.   AISD 
03487472 Apr. 30, 1968  A42b 1122  19700106 
D2487471   .     .   19700308 
03487471  J 16, 1969  A41d 25104 19700106 

我不是程序員,並開始使用python。我嘗試瞭如下腳本:

 import csv 
     import itertools 

     def is_end_of_record(line): 
      return line.startswith('WKU') 

     class FieldClassifier(object): 
      def __init__(self): 
       self.field='' 
      def __call__(self,row): 
       if not row[0].isspace(): 
        self.field=row.split(' ',1)[0] 
       return self.field 

     fields = 'WKU Filed Int. AISD'.split() 
     with open('C:\Users\Na\Desktop\example.txt', 'r') as infile: 
      with open('example.csv', 'wb') as oufile: 
      writer = csv.DictWriter(oufile, fiels=fields) 
      writer.writerow(dict((h, h) for h in fields)) 
      for end_of_record, lines in itertools.groupby(infile,is_end_of_record): 
       if not end_of_record: 
        classifier=FieldClassifier() 
        record={} 
        for fieldname, row in itertools.groupby(lines,classifier): 
         record[fieldname]='; '.join(r.strip() for r in row) 

它似乎不適合工作。 如果有人願意提供幫助或提供任何建議,我將不勝感激。

謝謝

+0

首先,在''writer = csv.DictWriter(oufile,fiels = fields)''將'fiels = fields'改爲'fieldnames = fields'這一行# – avasal 2013-02-28 07:20:51

回答

1

格式輸入文件是不是很嚴格。對於這種格式,我認爲re模塊非常有用。我爲每個記錄創建了正則表達式,第一個元素是一個鍵,第二個是值。我也是從itertools辭職:

import csv 
import re 

re_AISD = re.compile(r'(AISD)\s+(\S+)') 
re_WKU = re.compile(r'(WKU)\s+(\S+)') 
re_Filed = re.compile(r'(Filed)\s+(.*?\d{4})') 
re_Int = re.compile(r'(Int.) Cl.\s+(\w+ \d+)') 

FLD_REGEXPES = (re_AISD, re_WKU, re_Filed, re_Int) 

def get_field(line): 
    for ree in FLD_REGEXPES: 
     rx = ree.search(line) 
     if rx: 
      return (rx.group(1), rx.group(2)) 
    return (None, None) 

def convert_file(fname): 
    fields = 'WKU Filed Int. AISD'.split() 
    f = open(fname, 'r') 
    lines = f.readlines() 
    f.close() 
    with open(fname + '.csv', 'wb') as oufile: 
     writer = csv.DictWriter(oufile, fieldnames=fields, restval = '?', dialect='excel-tab') 
     writer.writerow(dict((h, h) for h in fields)) 
     rec = {} 
     for line in lines: 
      k, v = get_field(line) 
      if k: 
       print('[%s]=[%s]' % (k, v)) 
       if k == 'WKU': # start of new record 
        if rec: 
         writer.writerow(rec) 
        rec = {} 
       rec[k] = v 
     if rec: 
      writer.writerow(rec) 

還要注意C:/Users/Na/Desktop/example.txt - 在Python中的字符串\字符是「逃離」字符用於換行:\n,標籤:\t等。在完整路徑的文件名可以使用\\或更好使用/,可在Windows和Unix環境中使用。您也可以使用前綴爲r的「原始」字符串,我在re_AISD和其他正則表達式定義中使用了這樣的原始字符串。

+0

這個腳本完美無缺!非常感謝你!!我還有兩個問題,第一件事是我沒有得到輸出文件,除非我刪除代碼行「def convert_file(fname):」,這一行的作用是什麼,我需要保留還是放棄它?其次,如果我放棄了「restval ='?,dialect ='excel-tab'」,那麼它似乎會獲得更好看的表格,您是否也會告訴我此命令在此處扮演的角色。非常感謝! – NaNa 2013-02-28 20:45:37

+0

'def convert_file(fname):' - 它在Python中聲明函數。這種功能可以通過以下方式調用:'convert_file('C:/Users/Na/Desktop/example.txt')' – 2013-03-01 06:10:09

+0

請參閱編輯答案瞭解如何在字符串中使用Windows目錄分隔符:\。 – 2013-03-01 06:18:07