【问题标题】:match csv data with RegExp, Python将 csv 数据与 RegEx、Python 匹配
【发布时间】: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,粗略一瞥表明如果您这样做,您可能可以同时取消csvre
  • 是的,你是对的,有人将这样的 JSON 放在 csv 中,但由于它们被破坏,我无法用 json.loads() 解析它,并决定将它与 RegExp 匹配。好的,谢谢,将尝试使用 re.search

标签: python regex csv


【解决方案1】:

这不是一个 CSV 文件,而是一堆 JSON 对象放在一起。它们看起来都是有效的,所以你可以解析它们并以这种方式提取数据:

import csv
import json

with open('input.csv', 'r') as infile, open('output.csv', 'w') as outfile:
    writer = csv.writer(outfile)
    for line in infile:
        num_books = json.loads(line.strip())['Books']
        writer.writerow([num_books])

在 python 3.4 中测试。

【讨论】:

  • 谢谢,您的代码让我想到了一些想法,我意识到,文件中的第一行只是一个字符串(列名),从第二行开始 - JSON 对象开始,这就是我无法解析 JSON 的原因,因为我需要错过第一行并从第二行开始解析。现在代码可以工作了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-07
  • 2019-07-01
相关资源
最近更新 更多