如何使用正则表达式向文件插入更正 (Python)
How to insert corrections to a file using regex (Python)
我正在尝试更正数据集中的某些条目 (~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'"",', 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)
returns 一个空列表,因此字符串已更改但不知何故更改未写入文件
- 较小文件中的相同代码仅包含 1 个示例即可
谢谢!
编辑
我尝试在一个包含 3 个条目的文件上使用它,但它不起作用,所以我怀疑问题出在正则表达式上,与文件大小无关。
添加标志 re.MULTILINE
解决了问题:
add_quotes = re.compile(r'^(([^"]|"")(.*)([^"]|"")),(pos|neg)$', re.MULTILINE)
^
运算符可能只匹配没有此标志的第一行,而 $
可能只匹配最后一行,因此两者之间的每个条目都不匹配。
我的困惑是因为通过编辑器在文件中搜索这个表达式返回了匹配项,即使我认为我已经过滤掉了它们。
在整个文件中使用正则表达式匹配和替换模式会剥夺您对代码的部分控制权。通过遍历行,并自己对字符串应用更改,您将有更多机会调试和测试问题所在。
import csv
with open('output_file_name_here.csv', 'w') as output_file:
with open('input_file_name_here.csv') as input_file:
reader = csv.reader(input_file)
writer = csv.writer(output_file)
for row in reader:
(col1, col2) = row
if col1[0] != '"':
col1 = '"' + col1
if col[-1] != '"':
col1 = col1 + '"'
writer.writerow([col1, col2])
我正在尝试更正数据集中的某些条目 (~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'"",', 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)
returns 一个空列表,因此字符串已更改但不知何故更改未写入文件 - 较小文件中的相同代码仅包含 1 个示例即可
谢谢!
编辑
我尝试在一个包含 3 个条目的文件上使用它,但它不起作用,所以我怀疑问题出在正则表达式上,与文件大小无关。
添加标志 re.MULTILINE
解决了问题:
add_quotes = re.compile(r'^(([^"]|"")(.*)([^"]|"")),(pos|neg)$', re.MULTILINE)
^
运算符可能只匹配没有此标志的第一行,而 $
可能只匹配最后一行,因此两者之间的每个条目都不匹配。
我的困惑是因为通过编辑器在文件中搜索这个表达式返回了匹配项,即使我认为我已经过滤掉了它们。
在整个文件中使用正则表达式匹配和替换模式会剥夺您对代码的部分控制权。通过遍历行,并自己对字符串应用更改,您将有更多机会调试和测试问题所在。
import csv
with open('output_file_name_here.csv', 'w') as output_file:
with open('input_file_name_here.csv') as input_file:
reader = csv.reader(input_file)
writer = csv.writer(output_file)
for row in reader:
(col1, col2) = row
if col1[0] != '"':
col1 = '"' + col1
if col[-1] != '"':
col1 = col1 + '"'
writer.writerow([col1, col2])