Python CSV读取器错误地返回行的第一个元素
我正在使用python读取具有以下设置的CSV文件:Python CSV读取器错误地返回行的第一个元素,python,python-2.7,csv,Python,Python 2.7,Csv,我正在使用python读取具有以下设置的CSV文件: import unicodecsv, ssl ctx = ssl._create_unverified_context() response = urllib2.urlopen(url, timeout=300, context=ctx) data = unicodecsv.reader(response, delimiter=";", quo
import unicodecsv, ssl
ctx = ssl._create_unverified_context()
response = urllib2.urlopen(url, timeout=300, context=ctx)
data = unicodecsv.reader(response,
delimiter=";",
quotechar="\"",
doublequote=False,
quoting=unicodecsv.QUOTE_ALL,
skipinitialspace=True,
encoding="utf-8-sig")
对于这一行:
“身份证”;“产品”;“网址”;“颜色”;“股票”
它返回:
“ID”、产品、URL、颜色、库存
因此,对于行中的第一个元素,它保留引号。我之所以使用utf-8-sig,是因为有BOM字符。确认为Python2的Unicodesv中的bug(请参阅)
unicodesv.UnicodeReader
没有将编码传递给底层的csv.reader
,因此它不知道应该剥离BOM表,因此第一个字段不以引号开始,也不算作引号字段
这个问题现在已经有2.5年的历史了,这个项目上一次被触动是在4年多以前,而且似乎已经被放弃了。我强烈建议离开UnicodeSV。如果您必须使用它,请自己将响应读入字符串,剥离BOM,然后通过
io将清理后的文本传递给unicodesv
。StringIO
而不是显示设置,发布a更有效。我用一些代码更新了示例。为什么要使用skipinitialspace
和encoding
两次?删除它们,并在response=io.BytesIO(b'\xef\xbb\xbf'+'“ID”;“Product”;“URL”;“Color”;“Stock”.encode())
上运行,我无法重现您的错误-列表(数据)
是[[ID',Product',URL',Color',Stock']]
的使用是否意味着您正在使用Python 2?您可能应该这么说,如果是的话,还应该添加一个相应的标记@Amadan我已经删除了属性的重复。我发现您的结果中也有错误,因此可能是类似的。->',颜色“'谢谢你帮我找到它。我真的很接近找到这个,但你的更明确。