Python xlsx vers csv

J'utilise ce code pour convertir un excel dans un file csv. Le problème est que certains champs contiennent le text entre guillemets doubles et quand il effectue la conversion, je pense qu'il renferme entre guillemets les espaces blancs. Comment éviter cela?

import xlrd import unicodecsv import sys def xls_to_csv (xls_filename, csv_filename): wb = xlrd.open_workbook(xls_filename) sh = wb.sheet_by_index(0) fh = open(csv_filename,"wb") csv_out = unicodecsv.writer(fh, encoding='utf-8', delimiter=';') for row_number in range (1,sh.nrows): csv_out.writerow(sh.row_values(row_number)) fh.close() xls_to_csv(sys.argv[1],sys.argv[2]) 

Fichier Excel:

fichier Excel

Production réelle:

entrez la description de l'image ici

Mon objective est un CSV sans guillemets supplémentaires.

Les citations "supplémentaires" ne sont pas des données en soi. Les extraits les plus externes ( un à chaque extrémité) ne sont que des délimiteurs de string. Ces délimiteurs sont obligatoires dans le dialecte Excel de CSV lorsque datatables réelles contiennent des citations, ce que vous faites. Dans les délimiteurs de string, les citations réelles doivent être "échappées" en les doublant. (La première citation non modifiée sera interprétée comme le délimiteur de string de fermeture.)

Il semble que vous essayez d'écrire un dialecte personnalisé de CSV qui n'est pas destiné à être utilisé par Excel. Vous devez donc ajuster les parameters en conséquence:

 csv_out = unicodecsv.writer( fh, encoding='utf-8', delimiter=';', quoting=unicodecsv.QUOTE_NONE, quotechar=None) 

Ces parameters préserveront les caractères de citation de données existants, mais évitent d'append des caractères de spécification de délimitation . (C'est-à-dire que les parameters ci-dessus n'appendont jamais de citations de délimitation partout .) Le rest de votre code peut restr exactement le même.

Pour plus d'informations, lisez les documents CSV de Python 2 avec précaution. (Je suppose que vous utilisez Python 2 car vous utilisez unicodecsv . Il est conçu pour imiter l'interface du module csv aussi étroitement que possible. En fait, la façon recommandée de l'utiliser est de l'importer comme ceci:

 import unicodecsv as csv 

afin que le rest de votre code ressemble exactement comme si vous utilisez le csv Python, à l'exception du paramètre d' encoding possible. Incidemment, vous pouvez laisser ce paramètre si votre encoding souhaité est UTF-8.)

Vous pouvez supprimer toutes les citations existantes de chaque cellule avant de les écrire comme suit:

 def xls_to_csv(xls_filename, csv_filename): wb = xlrd.open_workbook(xls_filename) sh = wb.sheet_by_index(0) with open(csv_filename,"wb") as fh: csv_out = unicodecsv.writer(fh, encoding='utf-8', delimiter=';') for row_number in range (1, sh.nrows): row = [] for col in sh.row_values(row_number): try: row.append(col.ssortingp('"')) except AtsortingbuteError: row.append(col) csv_out.writerow(row) xls_to_csv(sys.argv[1],sys.argv[2]) 

Dans le cas où vous voulez le faire dans une fonction:

 import xlrd import unicodecsv import sys def xls_to_csv (xls_filename, csv_filename): wb = xlrd.open_workbook(xls_filename) sh = wb.sheet_by_index(0) fh = open(csv_filename,"wb") csv_out = unicodecsv.writer(fh, encoding='utf-8', delimiter=';') for row_number in range (1,sh.nrows): row = [] row = [s.replace('"', '') for s in sh.row_values(row_number)] csv_out.writerow(row) fh.close() xls_to_csv(sys.argv[1],sys.argv[2]) système d'import import xlrd import unicodecsv import sys def xls_to_csv (xls_filename, csv_filename): wb = xlrd.open_workbook(xls_filename) sh = wb.sheet_by_index(0) fh = open(csv_filename,"wb") csv_out = unicodecsv.writer(fh, encoding='utf-8', delimiter=';') for row_number in range (1,sh.nrows): row = [] row = [s.replace('"', '') for s in sh.row_values(row_number)] csv_out.writerow(row) fh.close() xls_to_csv(sys.argv[1],sys.argv[2])