如何解析一个可能跨多行的制表符分隔文件?

3

我有一个文件,其中包含不同的数据点并用制表符分隔:

"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'}]

在引用的字符串中,引号("字符本身)如何出现?它们被转义了吗?甚至有吗? - poke
使用split('\t'),我得到像'"ID"''"Value"'这样的东西。 - James Mertz
你尝试过使用csv模块吗? - spicavigo
你的数据中每个换行符前面都应该有一个双引号,对吗?我不用Python,但我会考虑使用正则表达式查找"\r"。 - Trebor
显然,这并不能回答你实际的问题,但如果你能控制所解析文件的格式,考虑禁止(转义)换行符,而不是将其引用。适当地转义(即\t\n\r\\)将使解析和传输数据比需要使用处理带引号单元格和特殊字符的特殊解析器更简单。 - dimo414
显示剩余2条评论
2个回答

6
import csv
r=csv.reader(open("a.tsv"), delimiter="\t", quotechar='"')
print r.next()

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

很好,我不知道 csv 可以处理这样的情况。 - poke

1
当迭代行时,您有两种可能性:在默认情况下,您正在读取新记录,因此应该像没有多行情况一样处理它。另一种情况是前一行没有结束记录,即没有以引号结尾的情况。在这种情况下,您仍然要添加到上一个记录中。因此,您只需要跟踪先前记录的状态和记录本身以解析文件。
类似以下内容:
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('"')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接