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
$
我有一个自动生成的 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
$