【问题标题】:Apply a function to each line of a CSV file in python将函数应用于python中的CSV文件的每一行
【发布时间】:2018-10-31 08:26:11
【问题描述】:

我有一个正则表达式,我想将其应用于 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)

【问题讨论】:

  • 你期望什么输出?此代码中的文件中没有打印或写入任何内容
  • myFunction 是否返回任何内容?如果是这样,您应该做的第一件事是将其分配给变量,否则输出将丢失。
  • @MatiasCicero 是的,myFunction 作为独立函数返回正确的输出。但不是当我在读取 CSV 方法中调用它时。由于某种原因,输出丢失了。
  • @PRMoureu 我希望在 S/0:XYZ 之后第二次出现 1 之前删除逗号
  • @RohitGirdhar 它总是返回值,但如果你不以任何方式处理它,它只会丢失在 void 中。输出不会自己写入文件。

标签: python csv nlp data-cleaning


【解决方案1】:

有一个名为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 文件,以备不时之需!

【讨论】:

  • 以前从未听说过文件输入,但它完美地完成了这项工作。这为我节省了很多时间。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2022-11-04
  • 2021-05-30
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 2014-04-30
  • 1970-01-01
相关资源
最近更新 更多