Есть пара проблем с вашим кодом.
В цикле чтения вы передаете объект csv.reader
в re.search
, но он не знает, как искать этот объект.Вам нужно передать ему текстовые или байтовые строки.
Строка
myData = list(row)
преобразует row
в новый список и сохраняет его в myData
, но это уже список, поэтому преобразование не требуется.И эта строка заменяет предыдущее содержимое myData
, но вы действительно хотите сохранить все соответствующие строки.Тем не менее, нет необходимости сохранять строки, вы можете просто записать их в новый файл по ходу работы.
В любом случае, это исправленная версия вашего кода.На снимке экрана видно, что вы хотите искать только текст в столбце 2 входных данных (что соответствует столбцу C в вашей электронной таблице).Я создал регулярное выражение, которое ищет целые слова "macet" и "kecelakaan", совпадения "\ b" на границах слов, поэтому мы не получим совпадение, если "macet" или "kecelakaan" является частью большегоword.
import re
import csv
# Make a case-insensitive regex to match the words "macet" or "kecelakaan"
pattern = re.compile(r'\bmacet\b|\bkecelakaan\b', re.I)
with open('example1.csv', 'r', newline='') as csvFile, open('example2.csv', 'w', newline='') as newFile:
reader = csv.reader(csvFile)
writer = csv.writer(newFile)
for row in reader:
# Skip empty rows
if not row:
continue
if pattern.search(row[2]):
print(row)
writer.writerow(row)
print("Writing complete")
Я только что сделал пару улучшений в этом коде.Теперь он использует аргумент newline=''
для открытия файлов CSV и пропускает все пустые строки во входном CSV.И регулярное выражение теперь игнорирует регистр при поиске подходящих слов.