读取文件中的记录,其在多个行拆分

问题描述:

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

老学校解决方案:使用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']