【问题标题】:Reading a record in a file which is split on multiple lines读取文件中拆分为多行的记录
【发布时间】:2017-01-23 13:07:19
【问题描述】:
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, Hello There what a wonderful day, 12th, Out in the market”

在读取内存中的所有文件后,我正在考虑在这里使用正则表达式。因此,例如,拥有像 (\d*|)(.*)(\d*|) 这样的正则表达式将允许我获取 2 个 ID 之间的所有内容,这将成为我的一个记录。

我使用上述方法遇到的问题是我需要如何转到下一条记录并重新开始匹配?

我想不出上面的模式可以帮助我解决我的问题。重申一下,我无法逐行阅读,因为记录本身的行被新行分割。

说明问题的另一种方式是如何格式化文件,即删除每条记录的新行,并逐行正确格式化每条记录。

任何指导将不胜感激。

【问题讨论】:

  • 您的文件有多大?您可以阅读整个文件并更改您的正则表达式以匹配具有多行的字段。
  • 我的文件不大,可以放入内存。
  • 这看起来像未转义的 csv 文本字段。管道符号可以出现在文本字段中吗?

标签: python regex file-io


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 2012-11-29
    相关资源
    最近更新 更多