【问题标题】:TypeError: list indices must be integers, not unicodeTypeError:列表索引必须是整数,而不是 unicode
【发布时间】:2015-04-17 08:41:30
【问题描述】:

我有一个 utf-8 编码的 csv 文件,我想在链接中的 UnicodeReader 类中使用 csv.DictReader 而不是使用 csv.Reader - https://docs.python.org/2/library/csv.html

class UTF8Recoder:  
    def __init__(self, f, encoding):  
        self.reader = codecs.getreader(encoding)(f)  
    def __iter__(self):  
        return self  
    def next(self):  
        return self.reader.next().encode("utf-8")  

class UnicodeReader:  
    def __init__(self, f, encoding="utf-8"):  
        f = UTF8Recoder(f, encoding)  
        self.reader = csv.DictReader(f, delimiter=b',')  
    def next(self):  
        row = self.reader.next()  
        return [unicode(s, "utf-8") for s in row]  
    def __iter__(self):  
        return self  

def csv_dict_reader(file_obj):  
    reader = UnicodeReader(file_obj)  
    for line in reader:  
        val = line [“first_column”]  

if __name__ == "__main__":  
    try:  
        with open(“abcd.csv") as f_obj:  
         csv_dict_reader(f_obj)  
    except IOError:  
        print "Error: can\'t find file - tz_2k3.csv or read data"  
        raise SystemExit  

我收到错误“TypeError:列表索引必须是整数,而不是 unicode”

【问题讨论】:

  • 是的,只需在 for 循环中打印 line 并打印行类型,即 type(line)
  • 为什么不使用DictReader() 而不是在这里创建一个new 阅读器?您现在得到的是列表,而不是字典。
  • 换句话说:你为什么要创建两个不同的阅读器?
  • 另外,这里的file_obj 是什么?您能给我们一个您的代码的最小、完整示例来重现问题吗?

标签: python csv unicode


【解决方案1】:

什么是 TypeError?

异常类型错误: 当操作或函数应用于不适当类型的对象时引发。关联的值是一个字符串,提供有关类型不匹配的详细信息。 Just click on me for more information.

演示:

>>> l1 = ["value1", "value2", "value3"]
>>> type(l1) 
<type 'list'>
>>> l1[2]   # Need index to access item from the list.
'value3'
>>> l1["value1"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not str
>>> 

【讨论】:

    【解决方案2】:

    我的同事通过修改 UnicodeReader 类中的 next 方法解决了这个问题,由于 UTF-8 BOM 字符存在一些问题

    def next(self):  
        d = self.reader.next()  
        return {unicode(k, "utf-8").strip(u'\ufeff'): unicode(v, "utf-8").strip(u'\ufeff') for k, v in d.items()}  
    

    【讨论】:

    • 您可以通过使用utf-8-sig 编解码器打开UnicodeReader 中的文件来修复它,而无需进行所有额外的剥离。它识别并删除\ufeff(如果存在)。示例:def __init__(self, f, encoding="utf-8-sig"):.
    • @MarkTolonen :我根据您的建议修复了额外的剥离。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    相关资源
    最近更新 更多