【发布时间】:2020-04-21 20:33:20
【问题描述】:
我正在尝试更正数据集中的某些条目 (~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)会返回一个空列表,因此字符串已更改,但不知何故更改并未写入文件 - 只有 1 个示例的较小文件上的相同代码有效
谢谢!
编辑
我尝试在包含 3 个条目的文件上使用它,但它不起作用,所以我怀疑问题出在正则表达式上,与文件大小无关。
【问题讨论】:
-
30MB 听起来并不大,因为它可以轻松放入计算机的内存中。如果您的程序运行时没有任何异常,则可能不是大小问题。
-
.* 是一个贪婪的匹配 - 也许尝试一个非贪婪的匹配或用逗号打断?
-
@MaxCrous 该文件确实适合我的记忆。删除 large 这个词是否有助于澄清问题?
-
我不确定这是否会澄清这个问题。我认为这里的部分挑战是正则表达式很难解析(对于人类来说),这让你很难确定它是否是正确的正则表达式。即是否匹配你要匹配的模式。另一种方法是使用 python csv 模块读取文件,并手动操作字符串。我现在将用示例代码写一个答案。
-
同时,看看这个关于正则表达式的答案,以及如何以模块化方式构建它们。 stackoverflow.com/questions/59021636/…
标签: python file-writing python-re