【问题标题】:How do I parse a tab delimited file that may have values across multiple lines?如何解析可能具有跨多行值的制表符分隔文件?
【发布时间】:2014-08-06 00:16:15
【问题描述】:

我有一个用不同数据点用制表符分隔的文件:

"ID"    "Value"
"1" "This is a value"

只需使用内置的 str 函数split,我就可以轻松地从中提取数据。但是有时我会遇到这种情况:

"ID"    "Value"
"1" "This is a value"
"2" "This is another
value"
"3" "Just one more"

第二个值跨越多行。如何完整地捕获每个数据点?

我最终想要的是一个像这样的字典列表:

[{'ID':'1', 'Value':'This is a value'}, {'ID':'2', 'Value':'This is another\nvalue'}, {'ID':'3', 'Value':'Just one more'}]

【问题讨论】:

  • 引号(" 字符本身)如何出现在带引号的字符串中?他们逃脱了吗?有吗?
  • 使用split('\t') 我得到'"ID"''"Value"' 之类的东西。
  • 多行是换行还是换行造成的?
  • 你试过csv模块吗?
  • 大概数据中的每个换行符前面都应该有一个双引号?是的?我不做 python,但我会考虑使用正则表达式来查找 "\r.

标签: python parsing multiline


【解决方案1】:
import csv
r=csv.reader(open("a.tsv"), delimiter="\t", quotechar='"')
print r.next()

这是一个可运行的示例http://codebunk.com/b/4095452/

【讨论】:

  • 很好,我不知道csv 可以处理这种情况。
【解决方案2】:

在遍历行时,您有两种可能性: 在默认情况下,您正在读取一条新记录,因此您应该像没有多行情况一样处理它。另一种情况是 previous 行没有结束记录,即它没有以引号结束。在这种情况下,您仍在添加到先前的记录。因此,您只需要跟踪上一条记录的状态以及记录本身即可解析您的文件。

类似这样的:

isNew = True
records = []
for line in file:
    if isNew:
        records.append(line.strip().split('\t'))
    else:
        records[-1][-1] += '\n' + line
    isNew = records[-1][-1].endswith('"')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    相关资源
    最近更新 更多