Применить функцию к каждой строке CSV-файла в Python - PullRequest
0 голосов
/ 21 мая 2018

У меня есть регулярное выражение, которое я хочу применить к каждой строке CSV-файла.

Вот функция, которая в основном удаляет все запятые, встречающиеся перед однозначным числом.Функция отлично работает для строки.

Input : text = "52A, XYZ Street, ABC District, 2, M, Brown
Function : re.sub('(?<!\s[\dA-Z]),(?!\s+\d,?)', '', text)
Output : '52A XYZ Street ABC District, 2, M, Brown'

Однако у меня есть CSV-файл, содержащий сотни таких строк.Например,

1, 5273249, 1061/72, 150-CF, S/O:XVZ, 1, ABX, 45, 0, Husband, 9213
1, 5272849, 1063/36, 150-AS, S/O:XVZ, 1, ABX, 45, 0, Wife, 9253
1, 5274549, 10626/12, 150-RT, S/O:XVZ, 1, ABX, 45, 0, Son, 9214

Я пытался прочитать его с помощью CSV-ридера и применить функцию, но, к сожалению, он не выдает никаких результатов.Что я тут не так сделал:

def myFunction(text):
    return re.sub('(?<!\s[\dA-Z]),(?!\s+\d,?)', '', text)

import csv
with open('temp1.csv', 'r') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=',')
    for row in spamreader:
        l = ','.join(row)    
        myFunction(l)

1 Ответ

0 голосов
/ 21 мая 2018

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

Взгляните на:

import re
import fileinput

# For each line
for line in fileinput.input(files='example.csv', inplace=True, backup='.bak'):
    # Replace it with the regex you provided
    print(re.sub('(?<!\s[\dA-Z]),(?!\s+\d,?)', '', line), end='')

Вывод:

Before:
1,  5273249, 1061/72, 150-CF, S/O:XVZ, 1, ABX, 45, 0, Husband, 9213
1,  5272849, 1063/36, 150-AS, S/O:XVZ, 1, ABX, 45, 0, Wife, 9253
1,  5274549, 10626/12, 150-RT, S/O:XVZ, 1, ABX, 45, 0, Son, 9214

After:
1,  5273249, 1061/72, 150-CF S/O:XVZ, 1, ABX, 45, 0, Husband, 9213
1,  5272849, 1063/36, 150-AS S/O:XVZ, 1, ABX, 45, 0, Wife, 9253
1,  5274549, 10626/12, 150-RT S/O:XVZ, 1, ABX, 45, 0, Son, 9214

Это также создает удобный example.csv.bak файл для вас на случай, если он вам понадобится!

...