在python中,如何让csv.DictReader正确处理包含行返回的字符串?

问题描述:

我有几个csv文件,其中包含带换行符的字符串。这些文件在Excel中可以正常打开,但是当我尝试使用csv.DictReader()读取文件时,csv.DictReader()似乎将字符串中的每个换行符处理为新的一行数据,而不是忽略运输在字符串中断开。在python中,如何让csv.DictReader正确处理包含行返回的字符串?

我能做些什么来获得第二次测试,就像第一次测试一样?

#csv contents 
this, is, a, test 
1,2,u'thr\nee',4 
5,6,7,8 

     result = [] 
     text = """this, is, a, test 
1,2,u'three',4 
5,6,7,8""" 
     b = StringIO(text) 
     reader = csv.DictReader(b) 
     for row in reader: 
       result.append(row) 

     self.assertEqual(2,len(result)) 
     expected = [{'this': '1', ' test': '4', ' is': '2', ' a': "u'three'"}, {'this': '5', ' test': '8', ' is': '6', ' a': '7'}] 
     self.assertEqual(expected ,result) 

     #With a /n inside the string. 

     result = [] 
     text = """this, is, a, test 
1,2,u'thr\nee',4 
5,6,7,8""" 
     b = StringIO(text) 
     reader = csv.DictReader(b) 
     for row in reader: 
       result.append(row) 

     self.assertEqual(2,len(result)) 
     #expected = [{'this': '1', ' test': '4', ' is': '2', ' a': "u'thr\nee'"}, {'this': '5', ' test': '8', ' is': '6', ' a': '7'}] 
     #self.assertEqual(expected,result) 

假设您的CSV内容是否正确引用,instanciating读者应该做的时候指定相应的quotechar:

http://docs.python.org/release/2.6.7/library/csv.html#csv.Dialect.quotechar

否则,我假设你有UNIX换行符( '\ n')在你的内容和DOS换行符('\ r \ n')作为行结束符。从Python 2.6.7开始,文档提到读者是硬编码的,无论您指定哪一个都是线路白蚁,不知道它是否与您的Python版本一样。如果是的话,你必须手动预处理(可能后处理)你的文件,以确保适当的引用或用其他东西替换单个'\ n',然后在csv解析之后做相反的处理。

+0

还有一个事实,即CSV文件应该以二进制模式打开。我记得最近在使用'csv'模块时遇到了麻烦。 – JAB