2017-06-15 29 views
1

有人可以幫助我嗎?我有這個錯誤。我想循環並將wordnet中的所有數據插入到excel的不同列中。它將首先讀取一列的Excel文件。然後,它將創建其他excel併爲每個單詞生成一行和不同列的同義詞。TypeError:'set'對象不支持Excel中的索引

此代碼生成同義詞都在一列:

import nltk 
import xlrd 
import csv 
import xlwt 
import xlsxwriter 
from nltk.corpus import stopwords 
from nltk.tokenize import word_tokenize 
from nltk.corpus import wordnet 

workbook = xlrd.open_workbook('C:\\Users\\runeza\Desktop\database.xlsx') 
sheet_names = workbook.sheet_names() 
sheet = workbook.sheet_by_name(sheet_names[0]) 

wb = xlwt.Workbook() 
ws = wb.add_sheet("test") 
for col_idx in range(sheet.ncols): 
    for row_idx in range(sheet.nrows): 
     cell = sheet.cell(row_idx, col_idx).value #read content in column cell 
     synonyms = [] 
     for syn in wordnet.synsets(cell): 
      for l in syn.lemmas(): 
       #print(l.name()) 
       synonyms.append(l.name()) 
       a = set(synonyms) 
     #print (a) 
     ws.write(row_idx, col_idx,",".join(a)) 

wb.save("sample.xls") 

我已經修改了代碼,以正確放置的話在不同的列:

import nltk 
import xlrd 
import csv 
import xlwt 
import xlsxwriter 
from nltk.corpus import stopwords 
from nltk.tokenize import word_tokenize 
from nltk.corpus import wordnet 

workbook = xlrd.open_workbook('C:\\Users\\runeza\Desktop\database.xlsx') 
sheet_names = workbook.sheet_names() 
sheet = workbook.sheet_by_name(sheet_names[0]) 

wb = xlwt.Workbook() 
ws = wb.add_sheet("test") 

for col_idx in range(sheet.ncols): 
    for row_idx in range(sheet.nrows): 
     cell = sheet.cell(row_idx, col_idx).value #read content in column cell 
     synonyms = [] 

     for syn in wordnet.synsets(cell): 
      for l in syn.lemmas(): 
       synonyms.append(l.name()) 
       a = set(synonyms) 
     #print (a) 

     for col_idx in range(len(a)): 
      for row_idx in range(len(a[col_idx])): 
       ws.write(col_idx, row_idx, a[col_idx][row_idx]) 

wb.save("sample.xls") 

但它給這個錯誤:

Traceback (most recent call last): 
    File "C:\Users\runeza\Documents\PythonCode\outputfile.py", line 29, in <module> 
    for row_idx in range(len(a[col_idx])): 
TypeError: 'set' object does not support indexing 

這就是我的(C:\ Users \ runeza \ Desktop \ database.xlsx)的樣子:

existing sheet

這是我期望的結果:

enter image description here

+0

我真的不能幫你,除非我能看到的文件,我不能告訴你有什麼去做。顯然,從你的錯誤錯誤,首先你在'col_idx'的兩個不同循環中使用相同的變量,其次對象不支持索引意味着你不能通過索引訪問它。 –

+0

請粘貼「C:\\ Users \\ runeza \ Desktop \ database.xlsx」文件以查看問題。 – saul

+0

我已編輯問題並插入文檔的外觀。 @ElvirMuslic – runeza

回答

0

您的需求,我認爲list將是一個更好的選擇。 set對象不支持索引(如[0])。

假設同義詞是被添加到rightside細胞,你可以這樣做:

for col_idx in range(sheet.ncols): 
    for row_idx in range(sheet.nrows): 
     cell = sheet.cell(row_idx, col_idx).value #read content in column cell 
     synonyms = [] 

     for syn in wordnet.synsets(cell): 
      for l in syn.lemmas(): 
       synonyms.append(l.name()) 

     # Making the list elements distinct. 
     synonyms = list(set(synonyms)) 

     for i in range(len(a)): 
      ws.write(row_idx, col_idx+i, synonyms[i]) # Made an edit here. 

wb.save("sample.xls") 
+0

我已經編輯了你的代碼「ws.write(row_idx,col_idx + i,synonyms同義詞[i]」,它的工作就像我期待的那樣,然而,我使用的同義詞來自wordnet,如果我重複相同的單詞'我沒有使用集 – runeza

+0

我已經編輯我的問題,並顯示我期待的結果。現在唯一的問題是從wordnet提供的同義詞是不斷重複,我不知道如何解決它,而不是使用集 – runeza

+0

@runeza列表元素可以通過將其轉換爲集合然後返回列表來區分。我已經將它添加到答案中。 – akhilsp