TypeError:'generator'对象不可订阅,csv文件

时间:2017-05-30 08:52:00

标签: python csv openpyxl

我得到了typeerror:'generator'对象在尝试在几个csv文件中创建信息列表时是不可订阅的,对它们进行排序以便我获取所需的信息并将该信息放入新的.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

2 个答案:

答案 0 :(得分:3)

worksheet.columns返回一个生成器(如错误​​所示)。您需要将其转换为可订阅对象(即列表或元组)才能按索引获取列:

cols = tuple(ws2.columns)
col_v = cols[0]
col_n = cols[1] 

甚至更好,假设只有两列:

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,并且不会在内存中创建不必要的列表。

答案 1 :(得分:3)

您在ws2上调用<?php $a = ১২; //(12) $b = ৫; //(5) echo $c = $a + $b; //OUTPUR 17 ?> 方法,该方法返回生成器而不是列表。您无法使用索引访问生成器的值,因此您有两个选项:

1)立即从生成器读取所有值并创建它们的列表,然后在列表上操作:

columns

2)使用column_list = list(ws2.columns) col_v = column_list[0] col_n = column_list[1] 函数只读取前两个值:

next

如果您的生成器返回项目序列,则最好使用方法2,因此您不希望创建所有项目的内存占用列表。在你的情况下,它可能无关紧要。