在 python 中对 CSV 文件的每一行应用一个函数
Apply a function to each line of a CSV file in python
我有一个要应用于 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 reader 读取它并应用该函数,但不幸的是,它没有产生任何输出。我这里做错了什么:
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)
有一个名为 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
文件,以备不时之需!
我有一个要应用于 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 reader 读取它并应用该函数,但不幸的是,它没有产生任何输出。我这里做错了什么:
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)
有一个名为 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
文件,以备不时之需!