Как вставить исправления в файл с помощью регулярных выражений (Python) - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь исправить некоторые записи в наборе данных (~ 30 МБ). В частности, CSV-файл с текстовым столбцом и столбцом pos / neg. В некоторых текстовых полях отсутствуют заключающие в кавычки обертки, поэтому я хотел бы вставить их вручную.
Вот код, который я написал для этого:

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 записями, и это не работает, поэтому я подозреваю, что проблема в регулярном выражении и не имеет никакого отношения к размеру файла.

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Добавление флага re.MULTILINE решило проблему:

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

Оператор ^, вероятно, не соответствует ни одной, кроме первой строки без этого флага и $ вероятно, соответствует только последнему, поэтому каждая промежуточная запись не была найдена.

Моя путаница заключалась в том, что поиск этого выражения в файле через редактор возвращал совпадения даже после того, как я решил, что отфильтровал их.

0 голосов
/ 22 апреля 2020

Использование регулярных выражений для сопоставления и подстановки шаблона во всем файле лишит вас контроля над вашим кодом. Итерируя по строкам и применяя изменения к строкам самостоятельно, у вас будет больше возможностей отлаживать и проверять, что не так.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...