【问题标题】:How to insert corrections to a file using regex (Python)如何使用正则表达式(Python)将更正插入文件
【发布时间】: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


【解决方案1】:

添加标志re.MULTILINE解决了问题:

add_quotes = re.compile(r'^(([^"]|"")(.*)([^"]|"")),(pos|neg)$', re.MULTILINE)

^ 运算符可能只匹配没有此标志的第一行,而 $ 可能只匹配最后一行,因此中间的每个条目都不匹配。

我的困惑是因为通过编辑器在文件中搜索此表达式返回匹配项,即使我认为我已将其过滤掉。

【讨论】:

    【解决方案2】:

    使用正则表达式在整个文件中匹配和替换模式将剥夺您对代码的一些控制权。通过遍历行并自己对字符串应用更改,您将有更多机会调试和测试错误所在。

    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])
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多