2017-02-07 3 views
2

Nous sommes dans la transition au travail de python 2.7 vers python 3.5. C'est un changement à l'échelle de l'entreprise et la plupart de nos scripts actuels ont été écrits en 2.7 et aucune bibliothèque supplémentaire. J'ai profité de la distribution Anaconda que nous utilisons et avons déjà modifié la plupart de nos scripts en utilisant le module 2to3 ou en les réécrivant complètement. Je suis coincé sur un morceau de code, que je n'ai pas écrit et l'auteur original n'est pas là. Il n'a pas non plus fourni de commentaires, donc je ne peux que deviner l'ensemble du script. 95% du script fonctionne correctement jusqu'à la fin où après il crée 7 fichiers CSV avec différentes informations analysées, il a une fonction personnalisée pour combiner les fichiers CSV dans et classeur xls avec chaque CSV comme nouvel onglet.Combiner plusieurs fichiers CSV dans un seul classeur xls Python 3

import csv 
import xlwt 
import glob 
import openpyxl 
from openpyxl import Workbook 

Parsefiles = glob.glob(directory + '/' + "Parsed*.csv") 
def xlsmaker(): 
    for f in Parsefiles: 
     (path, name) = os.path.split(f) 
     (chort_name, extension) = os.path.splittext(name) 
     ws = wb.add_sheet(short_name) 
     xreader = csv.reader(open(f, 'rb')) 
     newdata = [line for line in xreader] 
     for rowx, row in enumerate(newdata) 
      for colx, value in enumerate(row): 
       if value.isdigit(): 
      ws.write(rowx, colx, value) 

xlsmaker() 

for f in Parsefiles: 
    os.remove(f) 

wb.save(directory + '/' + "Finished" + '' + oshort + '' + timestr + ".xls") 

Ceci a été écrit tout en python 2.7 et fonctionne toujours correctement si je l'exécute en python 2.7. Le problème est qu'il génère une erreur lors de l'exécution de Python 3.5.

File "parsetool.py", line 521, in (module) 
    xlsmaker() 
File "parsetool.py", line 511, in xlsmaker 
    ws = wb.add_sheet(short_name) 
File "c:\pythonscripts\workbook.py", line 168 in add_sheet 
    raise TypeError("The paramete you have given is not of the type '%s'"% self._worksheet_class.__name__) 
TypeError: The parameter you have given is not of the type "Worksheet" 

Des idées sur ce qui devrait être fait pour corriger l'erreur ci-dessus? Iv'e a essayé plusieurs réécritures, mais j'ai des erreurs similaires ou de nouvelles erreurs. Je considère juste notre toute nouvelle méthode pour créer les xls, probablement des pandas à la place.

Répondre

5

Vous ne savez pas pourquoi cela se trompe. Cela vaut la peine de réécrire le code et d'utiliser plutôt des pandas. Les pandas peuvent lire chaque fichier csv dans une base de données distincte et enregistrer toutes les données sous forme de feuille séparée dans un fichier xls (x). Cela peut être fait en utilisant l'ExcelWriter de pandas. Par exemple.

import pandas as pd 
writer = pd.ExcelWriter('yourfile.xlsx', engine=xlsxwriter) 
df = pd.read_csv('originalfile.csv') 
df.to_excel(writer, sheet_name='sheetname') 
writer.save() 

Puisque vous avez plusieurs fichiers csv, vous auriez probablement eu envie de lire tous les fichiers csv et les stocker comme df dans un dict. Ensuite, écrivez chaque df à Excel avec un nouveau nom de feuille.

+0

Merci pour la réponse. Ce qui a vraiment résolu le problème était de corriger l'encodage des fichiers csv. En plus de cela, certains des fichiers devaient avoir un encodage spécifique différent du classeur pour que le script fonctionne. Totalement bizarre, mais ça marche et maintenant j'ai quatre scripts fonctionnant tous sous une interface graphique PyQt. Je vais probablement ajouter les pandas pour s'assurer que ça marchera dans le futur. –

+0

Hey @TobiasWright Est-il possible de poster le code ici? J'essaie de suivre. Je vous remercie. – JPC

+0

'NameError: le nom 'xlsxwriter' n'est pas défini'. En outre, il semble que 'pandas 'suppose que' openpyxl' est disponible. Pouvez-vous rendre cette réponse plus complète? (Je pars de miniconda, si ça répond pourquoi je n'ai pas tout installé.) – r2evans