2013-06-25 4 views
1

J'ai cherché cette question depuis un certain temps maintenant, mais je n'arrive pas à trouver une solution. J'utilise la fonction excelfiles pour créer une liste de tous les excelfiles, y compris "tst" dans leur nom dans un répertoire spécifié. Après cela, je veux lire certaines cellules de chaque document avec la fonction locate_vals, mais je ne peux pas sembler reaf fichiers à partir d'une liste de fichiers. Peut-être y a-t-il une solution vraiment simple à cela que je ne peux pas voir? L'erreur que je reçois est en bas.Lire les fichiers de la liste des fichiers

Ceci est une partie d'une plus grande tâche que j'ai demandé de l'aide pour hier (« Search through directories for specific Excel files and compare data from these files with inputvalues »), mais comme je ne peux pas sembler trouver une réponse à cette question que je pensais que ce serait mieux serait de lui donner un fil de lui-même. Corrigez-moi si je me trompe et je vais le supprimer :)

import xlrd 
import os, fnmatch 

#globals 

start_dir = 'C:/eclipse/TST-folder' 

def excelfiles(pattern): 
    file_list = [] 
    for root, dirs, files in os.walk(start_dir): 
     for filename in files: 
      if fnmatch.fnmatch(filename.lower(), pattern): 
       if filename.endswith(".xls") or filename.endswith(".xlsx") or filename.endswith(".xlsm"): 
        file_list.append(os.path.join(root, filename)) 
    return file_list 

file_list = excelfiles('*tst*')  # only accept docs hwom title includes tst 
for i in file_list: print i 


'''Location of each val from the excel spreadsheet''' 


def locate_vals(): 
    val_list = [] 
    for file in file_list: 
     wb = xlrd.open_workbook(os.path.join(start_dir, file)) 
     sheet = wb.sheet_by_index(0) 
     for vals in file: 
      weightvalue = file_list.sheet.cell(3, 3).value 
      lenghtvalue = sheet.cell(3, 2).value 
      speedval = sheet.cell(3, 4).value 

errorMessage:

Traceback (most recent call last): 
    File "C:\Users\Håvard\Documents\Skulearbeid\UMB\4. Semester Vår\Inf120 Programmering og databehandling\Workspace\STT\tst_mainsheet.py", line 52, in <module> 
    print locate_vals() 
    File "C:\Users\Håvard\Documents\Skulearbeid\UMB\4. Semester Vår\Inf120 Programmering og databehandling\Workspace\STT\tst_mainsheet.py", line 48, in locate_vals 
    weightvalue = file_list.sheet.cell(3, 3).value 
AttributeError: 'list' object has no attribute 'sheet' 

Répondre

2

Le problème a montré par votre retraçage est en effet que ceci:

weightvalue = file_list.sheet.cell(3, 3).value 

devrait être ceci:

weightvalue = sheet.cell(3, 3).value 

Cependant, il y avait plus de problèmes dans votre code. J'ai fait des corrections mineures et les a marqués dans les commentaires:

import xlrd 
import os, fnmatch 

start_dir = 'C:/eclipse/TST-folder' 

def excelfiles(pattern): 
    file_list = [] 
    for root, dirs, files in os.walk(start_dir): 
     for filename in files: 
      if fnmatch.fnmatch(filename.lower(), pattern): 
       if filename.endswith(".xls") or filename.endswith(".xlsx") or filename.endswith(".xlsm"): 
        file_list.append(os.path.join(root, filename)) 
    return file_list 

file_list = excelfiles('*tst*')  # only accept docs hwom title includes tst 
for i in file_list: print i 


'''Location of each val from the excel spreadsheet''' 


def locate_vals(): 
    val_dict = {} 
    for filename in file_list: 
     wb = xlrd.open_workbook(os.path.join(start_dir, filename)) 
     sheet = wb.sheet_by_index(0) 

     # problem 2: extract these values once per sheet 
     weightvalue = sheet.cell(3, 3).value 
     lengthvalue = sheet.cell(3, 2).value 
     speedvalue = sheet.cell(3, 4).value 

     # problem 3: store them in a dictionary, keyed on filename 
     val_dict[filename] = [weightvalue, lengthvalue, speedvalue] 

    # dictionary keyed on filename, with value a list of the extracted vals 
    return val_dict 

print locate_vals() 
+0

Merci! Je vais essayer cette approche à la place. J'ai beaucoup joué avec un projet dernièrement, alors mon script est un peu en désordre pour le moment. – Havard

+0

Ne pensez-vous pas que c'est la réponse la plus complète? :) (merci!) –

+0

Oui, je le fais :) Merci encore! – Havard

2

L'erreur tout indique que vous avez besoin:

AttributeError: 'list' object has no attribute 'sheet'

file_list est une liste de noms de fichiers, la liste n'a pas d'attribut sheet en python.

Alors, il vous suffit de remplacer:

weightvalue = file_list.sheet.cell(3, 3).value 

avec

weightvalue = sheet.cell(3, 3).value 
+0

Ou '.cell_value (3, 3)' être plus explicite. –

+0

Bon point, merci. – alecxe

+0

Merci! Probablement aurait dû voir cela;) Essayé différentes variétés de celui-ci, mais toujours eu quelques petites erreurs. Finalement, j'ai souffert de "l'erreur-message-aveuglement" semble-t-il. – Havard

1

Change:

weightvalue = file_list.sheet.cell(3, 3).value 

à:

weightvalue = sheet.cell(3, 3).value