这是我的问题。我需要解析一个逗号分隔的文件,并且我的代码可以按照我想要的方式工作,但是在测试它并尝试破坏东西时我遇到了问题。
这里是示例代码:
import csv
compareList=["testfield1","testfield2","testfield3","testfield4"]
z=open("testFile",'r')
x=csv.reader(z,quotechar='\'')
testDic={}
iter=0
for lineList in x:
try:
for item in compareList:
testDic[item]=lineList[iter]
iter+=1
iter=0
except IndexError:
iter=0
lineList=[]
for item in compareList:
testList.append("")
testDic[item]=lineList[iter]
iter+=1
iter=0
for item in compareList:
testFile.write(testDic[item])
if compareList.index(item)!=len(compareList)-1
testFile.write(",")
testFile.write('\n')
testFile.close()
z.close()
所以这应该做的是检查并确保 csv 文件的每一行都与列表的长度匹配。如果该行的长度与列表的长度不匹配,则该行将转换为等于compareList长度的空值(逗号)。 以下是文件内容的示例:
,,"sometext",343434
,,"moretext",343434
,,"stuff",4543343
,,"morestuff",3434354
如果该行缺少某个项目,该代码可以正常工作。所以 at 文件的输出包含:
,"sometext",343434
,,"moretext",343434
,,"stuff",4543343
,,"morestuff",3434354
看起来像这样:
,,,,
,,"moretext",343434
,,"stuff",4543343
,,"morestuff",3434354
我引发的问题是当该行看起来像这样时:
,"sometext",343434
,,"moretext",343434
,,"St,'",uff",4543343
,,"morestuff",3434354
该文件的输出将是:
,,,,
,,"moretext",343434
,,,,
因此它将按预期应用更改并清空第 1 行和第 3 行,但它只是停止该行的处理。我一直在绞尽脑汁试图弄清楚这里发生了什么,但没有运气。
一如既往,我非常感谢您愿意提供的任何帮助。
最佳答案
只需打印 csv.reader 返回的每一行即可了解问题所在:
>>> import csv
>>> z=open("testFile",'r')
>>> x=csv.reader(z,quotechar='\'')
>>> for lineList in x:
... print lineList
...
['', '"sometext"', '343434']
['', '', '"moretext"', '343434']
['', '', '"St', '",uff",4543343\n,,"morestuff",3434354\n']
最后两行只是 csv.reader 的一行。
现在,只需删除 quotechar='\''
>>> import csv
>>> z=open("testFile",'r')
>>> x=csv.reader(z)
>>> for lineList in x:
... print lineList
...
['', 'sometext', '343434']
['', '', 'moretext', '343434']
['', '', "St,'", 'uff"', '4543343']
['', '', 'morestuff', '3434354']
关于Python csv reader不完整的文件行迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42027818/