为什么一个简单的CSV清理python脚本可以工作,而另一个可以';T

为什么一个简单的CSV清理python脚本可以工作,而另一个可以';T,python,csv,Python,Csv,我有以下CSV,其中包含良好数据中的垃圾字符: setA, setB, setC, setD, setE ,1,text:u'GOOD DATA',BAD DATA:good.number,11.1 ,3,text:u'GOOD DATA',BAD DATA:good.number,11.2 ,5,text:u'GOOD DATA',BAD DATA:good.number,13.1 ,6,text:u'GOOD DATA',BAD DATA:good.number,11.5 清洁后

我有以下CSV,其中包含良好数据中的垃圾字符:

setA, setB, setC, setD, setE 
,1,text:u'GOOD DATA',BAD DATA:good.number,11.1 
,3,text:u'GOOD DATA',BAD DATA:good.number,11.2 
,5,text:u'GOOD DATA',BAD DATA:good.number,13.1 
,6,text:u'GOOD DATA',BAD DATA:good.number,11.5 
清洁后,应如下所示:

setA, setB, setC, setD, setE 
,1,GOOD DATA,BAD DATA:good.number,11.1 
,3,GOOD DATA,BAD DATA:good.number,11.2 
,5,GOOD DATA,BAD DATA:good.number,13.1 
,6,GOOD DATA,BAD DATA:good.number,11.5 
我有一个脚本,可以用它成功打开csv文件,清理数据:

from __future__ import print_function
from sys import stdin

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

for line in stdin:

    toks =[tok.replace("\'","").replace("text:u","").replace("number:", 
"") for tok in line.split()]

    print(' '.join(toks))
但我想用另一种方式,比如使用csv函数和DictReader:

rom __future__ import print_function
from sys import stdin
import csv

with open('./BROKENDATA.csv') as data:
    reader = csv.DictReader(data)
    for line in reader:
        toks = [tok.replace("\'","" 
).replace("text:u","").replace("number:", "") for tok in line.split()]
        print(' '.join(toks)) 
第二个脚本抛出错误:“AttributeError:'dict'对象没有属性'split'”


我认为这是因为dict没有和我以前做的一样的功能。因此A)为什么不,以及B)如何从第二个脚本中获得相同的功能

由于
reader
中的
是字典类型,因此您可以使用列键
setA、setB、setC、setD、setE来访问每列中的值,并从中编辑它们

from __future__ import print_function
from sys import stdin
import csv

new_rows = []
with open('./BROKENDATA.csv') as data:
    reader = csv.DictReader(data)
    new_rows.append(','.join(reader.fieldnames))
    for line in reader:
        toks = [line['setA'], line[' setB'], line[' setC'].replace("text:u","").replace("\'", ""), line[' setD'], line[' setE ']]
        new_rows.append(','.join(toks)) 

with open('./BROKENDATA.csv', 'w') as f:
    for row in new_rows:
        f.write(row + '\n')
以下是
字典的外观:

{' setD': 'GOOD DATA:2.2', ' setE ': '11.1 ', 'setA': '', ' setC': "text:u'GOOD DATA'", ' setB': '1'}
代码:

运行代码之前,
BROKENDATA.csv
的内容:

setA, setB, setC, setD, setE
,1,text:u'GOOD DATA',BAD DATA:good.number,11.1
,3,text:u'GOOD DATA',BAD DATA:good.number,11.2
,5,text:u'GOOD DATA',BAD DATA:good.number,13.1
,6,text:u'GOOD DATA',BAD DATA:good.number,11.5
输出:

setA,setB,setC,setD,setE
,1,GOOD DATA,BAD DATA:good.number,11.1
,3,GOOD DATA,BAD DATA:good.number,11.2
,5,GOOD DATA,BAD DATA:good.number,13.1
,6,GOOD DATA,BAD DATA:good.number,11.5

.split
是一种字符串方法,为什么您认为
dict
会有
.split
?它将如何工作?您认为在第二个脚本中,
line.split()
应该做什么?大概,您想使用
csv
解析csv。。。这就是我们所做的,并将该行的数据放入方便的dict中。您不必使用
csv.DictReader()
,只需使用
csv.reader()
。下次尝试调试您的脚本以查看您正在尝试的
split()。但是,您不应该只是在不理解的代码中添加行,然后期望代码像以前一样工作。在你自己的头脑中,当你写一行代码时,你应该问自己这样的问题:“这是做什么的,结果是什么,我为什么要这样做?”@juanpa.arrivillaga,我已经到了,我的朋友。每天学习更多。这样的反馈非常有用,谢谢。非常接近!看起来这会将其打印到控制台,但实际上不会更新源文件。另外,我在CSV文件上犯了一个错误。看起来它正在删除正确的数字并保留错误的数据。我以为您想根据给定的代码打印出行。我已经更新了我的答案,以便它将已清理的行存储在列表中,并在清理完成后使用它们更新源文件。我还删除了根据新输出擦除正确数字的操作。
setA,setB,setC,setD,setE
,1,GOOD DATA,BAD DATA:good.number,11.1
,3,GOOD DATA,BAD DATA:good.number,11.2
,5,GOOD DATA,BAD DATA:good.number,13.1
,6,GOOD DATA,BAD DATA:good.number,11.5