我正在尝试更正数据集中的某些条目(〜30MB)。特别是带有文本列和pos / neg列的csv文件。一些文本字段缺少自动引号,因此我想手动插入。这是我编写的代码:
add_quotes = re.compile(r'^(([^"]|"")(.*)([^"]|"")),(pos|neg)$')
with open(<path-to-csv>, 'r') as f:
s = f.read()
s = re.sub(add_quotes, r'"\1",\5', s)
with open(<path-to-same-csv>, 'w') as f:
f.write(s)
我面临的问题是,运行此代码后,我用来查找引号的正则表达式仍与文件中的某些条目匹配。到目前为止,我已经尝试过:1.以'r+'
的身份打开文件,并在写入之前调用f.seek(0)
,而不是先'r'
然后是'w'
。2.写入另一个文件。3.以字节格式而不是文本(即'r+b'
/ 'wb'
)打开和编辑文件。所有这些都运行平稳,但是达到了相同的结果。
注意:
add_quotes.findall(s)
返回一个空列表,因此更改了字符串,但是以某种方式未将更改写入文件中谢谢!
编辑
我尝试在具有3个条目的文件上使用此文件,但它不起作用,因此我怀疑问题在于正则表达式,与文件大小无关。
添加标志re.MULTILINE
解决了问题:
add_quotes = re.compile(r'^(([^"]|"")(.*)([^"]|"")),(pos|neg)$', re.MULTILINE)
^
运算符可能不匹配,但第一行没有此标志,而$
可能仅匹配最后一行,因此中间的每个条目都不匹配。
我的困惑是因为即使我以为我过滤掉了它们,通过编辑器在文件中搜索此表达式仍返回了匹配项。