2011-04-21 58 views
0

我覺得我過於簡單化/ overcomplexify DOC有時解析,這裏是我經常做的事:方法解析文檔和規範行

data = open('data.txt', 'rb').read() 

for line in data.split('\n'): 
    if not line.strip(): 
     continue 

這:

import csv 

filenames=['first_name', 'last_name', 'email', 'postcode', 'telephone_no', ] 
reader = csv.DictReader(open('data.csv', 'rb'), filenames=filenames) 

for line in reader: 
    if line['email'].strip() 
     email = line['email'].strip() 
    if line['first_name'].strip() 
     first_name= line['first_name'].strip().capitalize() 
    if line['last_name'].strip() 
     last_name = line['last_name'].strip().capitalize() 
    if line['postcode'].strip() 
     postcode= line['postcode'].strip().upper().replace(' ','') 
    if line['telephone_no'].strip() 
     telephone_no = line['telephone_no'].strip() 

與此:

item = " 4 -2,5456+263 @5" 
item = ''.join([char for char in item if char.isdigit()]) 

item = "+34 0394-234553" 
item = item.replace('+','').replace(' ','').replace('-','') 

關於改進/替代方案的任何提示/建議? :)

+1

打開你的文件是這樣的:'data = open(「data.txt」,「rb」)',然後這個'data line in data:'將遍歷行。不需要'split()'。另外,請考慮使用'with'來確保文件已關閉。 – 2011-04-21 11:19:30

+0

謝謝@ Space_C0wb0y! – RadiantHex 2011-04-21 11:24:29

+2

@ Space_C0wb0y:你的意思可能是'對於數據行:' – eumiro 2011-04-21 11:26:12

回答

1
with open('data.txt', 'rb') as myfile: 
    for line in myfile: 
     if not line: 
      continue 

正如你可能想要做的東西線,可以進一步簡化:

with open('data.txt', 'rb') as myfile: 
    for line in myfile: 
     if line: 
      do_whateveryouwant(line) 
2

你可以使非空行列表中的一個班輪

lines = filter(None, (line.strip() for line in open('data.txt', 'rb').readlines())) 

最快的方法,以消除一切,除了某些字符

使用__contains__字符串常量的方法filterfilter如果與字符串一起使用,則返回字符串)。所以你可以這樣刪除非數字字符:

import string 
filter(string.digits.__contains__, " 4 -2,5456+263 @5") 
+0

@lmran:太棒了!我真的很喜歡__contains__的例子,謝謝分享:) – RadiantHex 2011-04-21 12:04:54

+1

從'Python中的文本處理'發現了這個http://gnosis.cx/TPiP/ – Imran 2011-04-21 12:20:11