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

时间:2018-08-23 21:14:22

标签: python python-2.7 csv parsing python-2.x

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

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

我需要删除foo,bar,引号和冒号,而无需更改3位数据。

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

 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 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,但是似乎没有任何不良数据被删除。

3 个答案:

答案 0 :(得分:0)

请注意必须传递给replace()方法的参数:第一个arg。是要替换的内容,第二个参数。是要替换的东西。只需从str.replace(line,bar,'')中删除行即可。 replace是一种方法,第一个“隐藏”参数是 self ,这意味着在调用此方法的对象上使用方法,即在您的情况下在str var上使用

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

如果您想删除所有不是数字或空格的内容,为什么不对这个想法使用变体形式

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
$