TypeError: ‘_csv.reader’ 对象不可订阅

类型错误:“ _ csv.reader”对象不可订阅

TypeError: ‘_csv.reader’ object is not subscriptable

当我们尝试使用方括号访问 csv 阅读器对象中的索引时,会出现Python“TypeError: ‘ _ csv.reader’ object is not subscriptable”。要解决该错误,请将 csv 读取器对象传递给列表构造函数,从而将其转换为列表。

typeerror csv 阅读器对象不可订阅

下面是错误如何发生的示例。

主程序
import csv with open('employees.csv', newline='', encoding='utf-8') as csvfile: csv_reader = csv.reader(csvfile, delimiter=' ', quotechar='|') print(type(csv_reader)) # 👉️ <class '_csv.reader'> # ⛔️ TypeError: '_csv.reader' object is not subscriptable print(csv_reader[0])

我们使用方括号尝试访问 index 处的元素0,但该
_csv.reader对象不可订阅。

我们可以通过将_csv.reader对象转换为列表来解决这个问题。

主程序
import csv with open('employees.csv', newline='', encoding='utf-8') as csvfile: # ✅ convert to list csv_reader = list(csv.reader(csvfile, delimiter=' ', quotechar='|')) # 👇️ [['first_name,last_name'], ['Alice,Smith'], ['Bob,Smith'], ['Carl,Smith']] print(csv_reader) print(csv_reader[0]) # 👉️ ['first_name,last_name'] print(csv_reader[1]) # 👉️ ['Alice,Smith']

代码示例假定我们有一个employees.csv包含以下内容的文件。

雇员.csv
first_name,last_name Alice,Smith Bob,Smith Carl,Smith

_csv.reader列表对象是可订阅的,因此我们可以在将对象转换为列表后访问特定索引处的元素。

您可以使用一个简单的for循环遍历 csv 文件的行。

主程序
import csv with open('employees.csv', newline='', encoding='utf-8') as csvfile: csv_reader = csv.reader(csvfile, delimiter=' ', quotechar='|') for row in csv_reader: print(', '.join(row))

请注意,如果您尝试访问越界的列表索引,您将收到错误消息。try/except如果需要处理,可以使用语句。

主程序
import csv with open('employees.csv', newline='', encoding='utf-8') as csvfile: csv_reader = list(csv.reader(csvfile, delimiter=' ', quotechar='|')) try: print(csv_reader[100]) except IndexError: print('index out of bounds') # 👉️ this runs

该示例捕获IndexError索引超出范围时抛出的 。

列表构造函数采用可迭代对象(例如_csv.reader对象)并将其转换为列表。

The list constructor builds a list whose items are the same and in the same order as the iterable’s items.

The list constructor takes an iterable that may be a sequence, a container
that supports iteration or an iterator object.

You should only use square brackets to access subscriptable objects.

The subscriptable objects in Python are:

  • list
  • tuple
  • dictionary
  • string

All other objects have to be converted to a subscriptable object by using the
list(), tuple(), dict() or str() classes to be able to use bracket
notation.

Subscriptable objects implement the __getitem__ method whereas
non-subscriptable objects do not.

main.py
a_list = ['bobby', 'hadz', 'com'] # 👇️ <built-in method __getitem__ of list object at 0x7f71f3252640> print(a_list.__getitem__)

Conclusion #

当我们尝试使用方括号访问 csv 阅读器对象中的索引时,会出现Python“TypeError: ‘ _ csv.reader’ object is not subscriptable”。要解决该错误,请将 csv 读取器对象传递给列表构造函数,从而将其转换为列表。