2016-05-20 16 views
0

Ich benutze diesen Code, um ein Excel in eine CSV-Datei zu konvertieren, das Problem ist, dass einige Felder den Text in Anführungszeichen enthalten und wenn es die Konvertierung macht, denke ich, dass es in Anführungszeichen eingeschlossen ist die weißen Räume. Wie kann ich das vermeiden ?.Python xlsx zu csv

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]) 

Excel-Datei:

Excel file

tatsächliche Ausgang:

enter image description here

Mein Ziel ist eine CSV ohne zusätzliche doppelte Anführungszeichen.

Antwort

0

Die „zusätzliche“ Anführungszeichen sind nicht Daten per se. Die äußersten Anführungszeichen (ein an jedem Ende) sind nur String-Trennzeichen. Diese Trennzeichen sind obligatorisch im Excel-Dialekt von CSV, wenn die tatsächlichen Daten Zitate enthält, die Ihre tut. Innerhalb von String-Trennzeichen müssen aktuelle Anführungszeichen durch Verdopplung "entkoppelt" werden. (Das erste nicht überlagerte Angebot wird als das abschließende Zeichenfolgebegrenzer interpretiert.)

Es klingt wie Sie versuchen, eine custom dialect of CSV schreiben, die nicht von Excel verwendet werden soll. So müssen Sie entsprechend die Parameter einstellen:

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

Diese Einstellungen beibehalten werden Daten Anführungszeichen vorhandenen, aber verhindern Hinzufügen irgendwelcher Begrenzer Anführungszeichen. (Das heißt, die obigen Einstellungen werden nie hinzufügen beliebig Abgrenzung Zitate überall.) Der Rest Ihres Codes kann genau gleich bleiben.

Für weitere Informationen lesen Sie bitte Python 2's CSV docs sorgfältig. .. (Ich nehme an, Sie Python 2 verwenden, weil Sie unicodecsv verwenden Es entwickelt, um die csv Moduls Schnittstelle so nah wie möglich zu imitieren In der Tat, der empfohlene Weg, es zu benutzen, ist es so zu importieren:

import unicodecsv as csv 

, so dass der Rest des Codes sieht genau, als ob Sie mit Python eigenen csv, mit Ausnahme des möglichen encoding Parameter. Übrigens, Sie, dass Parameter weglassen können, wenn Sie die gewünschte Codierung UTF-8 ist.)

1

Sie könnten nur von jeder Zelle sie alle vorhandenen Anführungszeichen Streifen vor dem Schreiben wie folgt:

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.strip('"')) 
       except AttributeError: 
        row.append(col) 

      csv_out.writerow(row) 

xls_to_csv(sys.argv[1],sys.argv[2]) 
0

Falls Sie es in einer Funktion zu tun:

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])