Python 用于从 CSV 文件中删除错误字符的脚本

Python script to remove erroneous characters from a CSV file

我有一个自动生成的 CSV 文件,它提供了我需要的数据,但是一些单独的单元格中有多余的字符。

COLUMN1           COLUMN2          COLUMN3
'Foo325GoodData'  Bar:388GoodData  383GoodData
'Foo123GoodData'  Bar:998GoodData  293GoodData

我需要在不改变 3 位数据的情况下删除 foo、横线、引号和冒号。

这是我试过的代码,但它只是删除了我的所有数据:

 import csv
 import string

 input_file = open('data.csv', 'r')
 output_file = open('data_cleaned.csv', 'w')
 data = csv.reader(input_file)
 writer = csv.writer(output_file,quoting=csv.QUOTE_ALL)
 foo = 'foo'
 bar = '"bar:u'

 for line in data:
     line = str(line)
     new_line = str.replace(line,foo,'')
     new_line2 = str.replace(line,bar,'')
     writer.writerow(new_line.split(','))
     writer.writerow(new_line2.split(','))

根据下面 gboffi 的说明,我尝试了以下操作:

cleaner.py < bad.csv > good.csv

 from __future__ import print_function
 from sys import stdin


 q = '"' + "'"
 number = 'foo:'

 print(next(stdin) , end='')

 for line in stdin:

     toks = [tok.strip(q).lstrip(number) for tok in line.split()]

     print(' '.join(toks))

这会生成一个新的 CSV,但 none 的不良数据似乎已被删除。

注意必须传递给 replace() 方法的参数:第一个参数。是要替换的内容,第二个参数。是用什么来代替。只需从 str.replace(line,bar,'') 中删除行。 replace 是一种方法,第一个 "hidden" 参数是 self,这意味着在调用此方法的对象上使用方法,即在你的情况下 str var

foo = 'foo"12jko'
bar = '"bar:u2345'

foo = "".join([i for i in list(foo) if i.isdigit()])
bar = "".join([i for i in list(bar) if i.isdigit()])

print(foo, bar)

结果,

12 2345

根据您的要求调试您的代码。 使用正则表达式是最好的选择。

如果你想删除所有不是数字或 space 的东西,你为什么不使用这个想法的变体

for line in data:
    print(''.join(c for c in line if c in '0123456789 '))

我们在哪里(''.join(...))仅在每个输入行中将需要的字符粘在一起?


更新

保留之前的答案,因为它完全符合 OP 最初表达的要求(请参阅问题的编辑历史记录)。

但是,考虑到 OP 给出的 new 要求,他们可以尝试使用以下代码

$ cat nofubar.py 
from sys import stdin

q = '"' + "'"             # we want to remove the 'q'outes
foobar = 'FooBar:'        # and also Foo, Bar and ':' too...

print(next(stdin), end='') # print the header line to stdout, note end=''

for line in stdin:

    # strip quotes on both sides,
    # strip (all) the characters in foobar * only on the left *
    toks = [tok.strip(q).lstrip(foobar) for tok in line.split()]

    print(' '.join(toks))
$

让我们测试一下这个新代码

$ python nofubar.py << END > good.csv
COLUMN1           COLUMN2          COLUMN3
'Foo325GoodData'  Bar:388GoodData  383GoodData
'Foo123GoodData'  Bar:998GoodData  293GoodData
END
$ cat good.csv 
COLUMN1           COLUMN2          COLUMN3
325GoodData 388GoodData 383GoodData
123GoodData 998GoodData 293GoodData
$ 

假设包含无关字符的文件名为 bad.csv,您可以使用 shell 命令中的 input redirection 符号 < 将其连接到 stdin

$ python nofubar.py < bad.csv > good.csv
$