我有一个自动生成的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,但是似乎没有任何不良数据被删除。
答案 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
$