【发布时间】:2016-06-15 14:15:40
【问题描述】:
我有一个 csv 文件,其中包含以下行:
{"Books \u3009 Arts & Photography \u3009 Sculpture \u3009 Appreciation": 342444, "Books": 4244234234875}
{"Books \u3009 Science": 342864, "Books": 44242875}
{"Books \u3009 Politics": 342444, "Books": 4135875}
我需要读取 csv 文件并匹配 "Books": \d+,我只需要那个号码,并将其放入新的 csv 文件中
import csv
import json
import re
with open('input.csv', 'rb') as infile:
with open('output.csv', 'wb',) as outfile:
reader = csv.reader(infile)
writer = csv.writer(outfile)
for line_num, line in enumerate(reader):
result = re.match(r'^"Books":(\d+)$', line[0])
writer.writerow([result])
但是代码不能正常工作,基本上我收到空白单元格,这意味着我无法匹配所需的数据。如果我匹配.*,我会在 0x028B2800> 处收到“<_sre.sre_match>
【问题讨论】:
-
是那是一个 CSV 文件吗?使用
{}s,它看起来更像是损坏的 JSON,或者有人刚刚将字典文字转储到文件中。请注意,在您的情况下,字符串的开头是{而不是"Books- 如果您print(line[0])会发生什么?为什么得到一个SRE_Match对象会让你感到惊讶,这就是应该发生的事情! -
result.group(1)或许re.search更合适。 -
可能它不起作用的原因是
:和您在模式中没有考虑的数字之间有一个空格。但我同意 jonrsharpe 的观点……这看起来不太适合解释为 CSV。 -
另外,
line[0]不应该是line[1]吗?看起来您打算使用json,粗略一瞥表明如果您这样做,您可能可以同时取消csv和re。 -
是的,你是对的,有人将这样的 JSON 放在 csv 中,但由于它们被破坏,我无法用 json.loads() 解析它,并决定将它与 RegExp 匹配。好的,谢谢,将尝试使用 re.search