TypeError: 'generator' object is not subscriptable, csv file
TypeError: 'generator' object is not subscriptable, csv file
我在尝试在多个 csv 文件中制作信息列表时遇到类型错误:'generator' 对象不可订阅,对它们进行排序以便获得我需要的信息并将该信息放入新的 . .xlsx 文件。我想知道这里是否有人可以帮助我解决我出错的地方。是无法访问 csv 文件还是我的代码有问题?
(我没有添加完整的代码,只添加了出现错误的代码)
代码:
import csv
import operator
from openpyxl import Workbook, load_workbook
import os
import logging
def opencsv(csvfile):
csvdata = []
with open(csvfile, encoding='utf-8-sig') as csv_input:
try:
reader = csv.reader(csv_input, delimiter=';')
for row in reader:
key_1 = row[0]
key_2 = row[1]
1_2 = key_1.split(';')
2_1 = key_2.split(';')
csvdata.append(list+link)
sortedlist = sorted(csvdata, key=operator.itemgetter(0),
reverse=False)
return sortedlist
finally:
csv_input.close()
def copycsv(excel_file, csvfile):
rel_path_xlsx = r'C:\Myfolder\xlsx'
rel_path_csv = r'C:\Myfolder\CSV'
wb1 = load_workbook(rel_path_xlsx+"\"+excel_file)
wb2 = Workbook()
ws1 = wb1.active
ws2 = wb2.active
sortedlist = opencsv(rel_path_csv+"\"+csvfile)
listed = sorted(sortedlist, key=operator.itemgetter(0), reverse=False)
for info in listed:
ws2.append(info)
col_v = ws2.columns[0] #line 39, error
col_n = ws2.columns[1]
for idx, cell in enumerate(col_v, 1):
ws1.cell(row=idx, column=4).value = cell.value
for idx, cell in enumerate(col_n, 1):
ws1.cell(row=idx, column=5).value = cell.value
wb1.save(r"C:\Myfolder"+"\"+"file_"+excel_file)
def copyxlsx(rel_path_xlsx, rel_path_csv):
for filename in zip(sorted(os.listdir(rel_path_xlsx)),
sorted(os.listdir(rel_path_csv))):
print(filename[0], filename[1])
copycsv(filename[0], filename[1]) #line 55, error
Traceback (most recent call last):
line 55, in copyxlsx
copycsv(filename[0], filename[1])
line 39, in copycsv
col_v =ws2.columns[0]
TypeError: 'generator' object is not subscriptable
我是 python 的新手,所以非常感谢您的帮助!在 Python3.4.1
工作
worksheet.columns
returns 生成器(如错误提示)。您需要将其转换为可订阅对象(即列表或元组)以便按索引获取列:
cols = tuple(ws2.columns)
col_v = cols[0]
col_n = cols[1]
或者更好,假设只有 2 列:
col_v, col_n = tuple(ws2.columns)
或者如果超过 2 列,你不关心其余的并使用 Python 3:
col_v, col_n, *_ = tuple(ws2.columns)
注意这会在内存中创建一个无用的列表。你也可以做
col_v, col_n = tuple(ws2.columns)[:2]
在 Python 2 和 3 中都有效,不会在内存中创建不必要的列表。
您在 ws2 上调用 columns
方法,它 returns 一个 生成器 而不是一个列表。您不能使用索引访问生成器的值,因此您有两个选择:
1) 一次从生成器中读取所有值并创建它们的列表,然后对列表进行操作:
column_list = list(ws2.columns)
col_v = column_list[0]
col_n = column_list[1]
2) 使用 next
函数只读取前两个值:
col_v = next(ws2.columns)
col_n = next(ws2.columns)
如果您的生成器 returns 一个 长 项目序列,则方法 2 更可取,因此您不想创建所有项目的内存占用列表.在您的情况下,这可能无关紧要。
我在尝试在多个 csv 文件中制作信息列表时遇到类型错误:'generator' 对象不可订阅,对它们进行排序以便获得我需要的信息并将该信息放入新的 . .xlsx 文件。我想知道这里是否有人可以帮助我解决我出错的地方。是无法访问 csv 文件还是我的代码有问题? (我没有添加完整的代码,只添加了出现错误的代码)
代码:
import csv
import operator
from openpyxl import Workbook, load_workbook
import os
import logging
def opencsv(csvfile):
csvdata = []
with open(csvfile, encoding='utf-8-sig') as csv_input:
try:
reader = csv.reader(csv_input, delimiter=';')
for row in reader:
key_1 = row[0]
key_2 = row[1]
1_2 = key_1.split(';')
2_1 = key_2.split(';')
csvdata.append(list+link)
sortedlist = sorted(csvdata, key=operator.itemgetter(0),
reverse=False)
return sortedlist
finally:
csv_input.close()
def copycsv(excel_file, csvfile):
rel_path_xlsx = r'C:\Myfolder\xlsx'
rel_path_csv = r'C:\Myfolder\CSV'
wb1 = load_workbook(rel_path_xlsx+"\"+excel_file)
wb2 = Workbook()
ws1 = wb1.active
ws2 = wb2.active
sortedlist = opencsv(rel_path_csv+"\"+csvfile)
listed = sorted(sortedlist, key=operator.itemgetter(0), reverse=False)
for info in listed:
ws2.append(info)
col_v = ws2.columns[0] #line 39, error
col_n = ws2.columns[1]
for idx, cell in enumerate(col_v, 1):
ws1.cell(row=idx, column=4).value = cell.value
for idx, cell in enumerate(col_n, 1):
ws1.cell(row=idx, column=5).value = cell.value
wb1.save(r"C:\Myfolder"+"\"+"file_"+excel_file)
def copyxlsx(rel_path_xlsx, rel_path_csv):
for filename in zip(sorted(os.listdir(rel_path_xlsx)),
sorted(os.listdir(rel_path_csv))):
print(filename[0], filename[1])
copycsv(filename[0], filename[1]) #line 55, error
Traceback (most recent call last):
line 55, in copyxlsx
copycsv(filename[0], filename[1])
line 39, in copycsv
col_v =ws2.columns[0]
TypeError: 'generator' object is not subscriptable
我是 python 的新手,所以非常感谢您的帮助!在 Python3.4.1
工作worksheet.columns
returns 生成器(如错误提示)。您需要将其转换为可订阅对象(即列表或元组)以便按索引获取列:
cols = tuple(ws2.columns)
col_v = cols[0]
col_n = cols[1]
或者更好,假设只有 2 列:
col_v, col_n = tuple(ws2.columns)
或者如果超过 2 列,你不关心其余的并使用 Python 3:
col_v, col_n, *_ = tuple(ws2.columns)
注意这会在内存中创建一个无用的列表。你也可以做
col_v, col_n = tuple(ws2.columns)[:2]
在 Python 2 和 3 中都有效,不会在内存中创建不必要的列表。
您在 ws2 上调用 columns
方法,它 returns 一个 生成器 而不是一个列表。您不能使用索引访问生成器的值,因此您有两个选择:
1) 一次从生成器中读取所有值并创建它们的列表,然后对列表进行操作:
column_list = list(ws2.columns)
col_v = column_list[0]
col_n = column_list[1]
2) 使用 next
函数只读取前两个值:
col_v = next(ws2.columns)
col_n = next(ws2.columns)
如果您的生成器 returns 一个 长 项目序列,则方法 2 更可取,因此您不想创建所有项目的内存占用列表.在您的情况下,这可能无关紧要。