2017-05-30 46 views
0

我收到类型错误:“发电机”对象是不是想使信息列出了几个CSV文件时,标化,对它们进行排序,使我得到我需要的信息并将这些信息放入一个新的.xlsx文件中。我想知道这里有没有人可以帮我解决我的问题。难道不能被访问或者是有什么错我的代码的CSV文件? (其中我的错误我没加整个代码,只有代码)类型错误:“发电机”对象不是标化,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(veiliste+lenker_per_vei) 
       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 

我很新的蟒蛇,所以任何帮助将不胜感激!在Python3.4.1

+0

最低配置,你可以已经发布了错误的行号。但通常你必须发布完整的堆栈跟踪。你期望我们仔细阅读你的代码中的everyline,寻找一条可能会抛出该错误的行http://stackoverflow.com/help/how-to-ask – e4c5

+0

对不起,我已经添加了现在出现错误的行。 – Pexe

回答

2

worksheet.columns工作返回一个发生器(作为误差建议)。你需要它才能转换为标化的对象(即列表或元组),通过指数来获得一个列:

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

+0

或者调用'col_v = next(ws2.columns); col_n =下一个(ws2.columns)'和不约尺寸 – Slam

+0

谢谢关心,它的作品! – Pexe

2

您对ws2调用columns方法,该方法返回生成器而不是列表。使用索引时,不能访问生成的价值观,所以你有两个选择:

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) 

方法2是最好,如果你的发电机返回项目的序列,所以你不希望创建人的记忆中拱列表他们中的一个。在你的情况下,这可能没有关系。

相关问题