首页 > 解决方案 > 用python解析CSV中的困难字符串

问题描述

我正在为我的 Firefox 历史记录 CSV 构建解析器。它包括这样的行:

"2017-07-12 09:43:31","https://english.stackexchange.com/questions/26498/should-there-always-be-a-comma-after-therefore-however-etc","punctuation - Should there always be a comma after ""therefore","However" etc.? - English Language & Usage Stack Exchange"

有没有一种有效的方法来处理这个问题(例如使用一些匹配模板的工具)?从理论上讲,它应该可以解析,因为它总是"$DATE","$URL","$everything_else"但是我不能使用普通的 CSV 解析器(行中有很多逗号)并且我的脚本只匹配 '","' 在这些情况下也失败了。

此外,第三个字段并不总是存在,格式为"$DATE","$URL". 但我认为那是一个小问题。

标签: pythoncsv

解决方案


可能有更好的方法来做到这一点,但正则表达式可以做到这一点:

import re
capture = re.findall(r"^\"([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2})\",\"([^\"]+)\",?(.+)?$",csv_string)

它返回一个列表列表(下面的示例)。

[('2017-07-12 09:43:31', 'https://english.stackexchange.com/questions/26498/should-there-always-be-a-comma-after-therefore-however-etc',   '"punctuation - Should there always be a comma after ""therefore","However" etc.? - English Language & Usage Stack Exchange"')]

根据您要对数据执行的操作,您可能需要从那里提出一个额外的处理程序。如果i代表您的行号,您可以通过以下方式访问信息:list_for_line[i][0]对于时间戳;list_for_line[i][1]对于网址;和list_for_line[i][2]描述。


推荐阅读