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

我正在使用python读取具有以下设置的CSV文件:

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我已经删除了属性的重复。我发现您的结果中也有错误,因此可能是类似的。->',颜色“'谢谢你帮我找到它。我真的很接近找到这个,但你的更明确。