2017-01-23 65 views
1
ID|Text 1|Date|Text2 
1|Hello There 
what a wonderful day|12th|Out in the market 
2|Well I wish|13th|Sleeping 
3|It is rocking, python 
is a great language 
to code|18th|what to do 
in this scenario 
4|Text issues|19th|Solving 

所以我有我想要的逐行讀取每個記錄行文件在上述格式的文本但有一個問題,即內有新線這個記錄不會讓我重複使用'for line in file:'成語。我的問題是我必須閱讀所有上述記錄,一次記錄。從上面的文件中記錄的讀取文件中的記錄,其在多個行拆分

例:「1,你好有什麼美好的一天,12日,在外面的市場」

我閱讀完所有的文件在內存中後,想在這裏使用正則表達式的。舉例來說,像(\d*|)(.*)(\d*|)這樣的正則表達式可以讓我得到2個ID之間的所有內容,而這成爲我的一個記錄。

我對上述方法有問題,我該如何去下一個記錄再次開始匹配?

我無法想象上述哪種模式可以幫助我解決問題。重申我不能一行一行地閱讀,因爲記錄中的行本身被新行分割。

說明問題的另一種方式是如何格式化文件,以便每條記錄都刪除新行,並且每條記錄都可以逐行正確格式化。

任何指導,將不勝感激。

+0

多大的文件?您可以閱讀整個文件並更改您的正則表達式以匹配具有多行的字段。 –

+0

我的文件並不大,它會適合內存。 –

+0

這看起來像未轉義的csv文本字段。管道符號是否可以出現在文本字段中? – schwobaseggl

回答

0

老學校解決方案:使用csv模塊,累計行大小&連接,直到大小與標題大小相同。

import csv 

rows = [] 
prev_row = None 
with open("foo.csv") as f: 
    cr = csv.reader(f,delimiter='|') 
    title = next(cr) 
    rows.append(title) 
    for row in cr: 
     if prev_row: 
      prev_row[-1]+="\n"+row[0] 
      prev_row+=row[1:] 
     else: 
      prev_row = row 

     if len(prev_row)==len(title): 
      rows.append(prev_row) 
      prev_row = [] 

for row in rows: 
    print(row) 

行打印爲

['ID', 'Text 1', 'Date', 'Text2'] 
['1', 'Hello There\nwhat a wonderful day', '12th', 'Out in the market'] 
['2', 'Well I wish', '13th', 'Sleeping'] 
['3', 'It is rocking, python\nis a great language\nto code', '18th', 'what to do'] 
['in this scenario\n4', 'Text issues', '19th', 'Solving']