2016-11-02 4 views
1

Ich benutze diesen CSV-Reader, um alle meine CSV-Datei zu lesen, dann in xls Arbeitsmappe kombinieren. Aber nach dem Öffnen von Excel wird nun die ganze Nummer von CSV als Text gelesen.Wie schreibe ich einen Python-Code, um mehrere csv zu Excel zu kombinieren, ohne Nummer als Text gelesen .. in Excel?

In jedem csv hat es sowohl Buchstaben als auch Zahlen. Gibt es eine Möglichkeit, alle Zahlenwerte von CSV zu komprimieren, um Excel wissen zu lassen, es ist Nummer nicht Text?

import glob, csv, xlwt, os 

wb = xlwt.Workbook() 
for filename in glob.glob("d:/test/*.csv"): 
    (f_path, f_name) = os.path.split(filename) 
    (f_short_name, f_extension) = os.path.splitext(f_name) 
    ws = wb.add_sheet(f_short_name) 
    spamReader = csv.reader(open(filename, "rt")) 

    for rowx, row in enumerate(spamReader): 
     for colx, value in enumerate(row): 
      ws.write(rowx, colx, value) 
wb.save("d:/test/compiled.xls") 

Antwort

2

Ich würde verwenden, um die pandas Bibliothek, die auch Sie mit dem Gesamt Python Daten Wissenschaft Stack verbinden würde. Pandas sind schlau genug, um die Datentypen für Excel korrekt zu interpretieren.

import glob, os 
import pandas as pd 

from pandas import DataFrame, ExcelWriter 

writer = ExcelWriter("d:/test/compiled.xlsx") 

for filename in glob.glob("d:/test/*.csv") 
    df_csv = pd.read_csv(filename) 

    (_, f_name) = os.path.split(filename) 
    (f_short_name, _) = os.path.splitext(f_name) 

    df_csv.to_excel(writer, f_shortname, index=False) 

writer.save() 

Sie öffnen eine Tabelle für das Schreiben, lesen Sie jede CSV als Pandas DataFrame und dann die DataFrame auf das Blatt auf einer separaten Registerkarte schreiben. Die index=False Stück ist da, so dass Python nicht den Standard DataFrame Index auf das Blatt schreibt, die Ihnen eine zusätzliche unerwünschte Spalte geben würde.

+0

Das Problem wurde dadurch nicht gelöst, weil das Hinzufügen alle csv zu einem Blatt zusammenfasst und nicht mehreren Blättern zuordnet. Vielen Dank. – JPC

+1

Ja, deshalb habe ich gesagt, dass ich es bearbeitet habe. Fast bereit. –

+0

OK, es ist behoben. –

1

Der einfachste Weg:

  for rowx, row in enumerate(spamReader): 
       for colx, value in enumerate(row): 
        try: 
         value = float(value) 
        except ValueError: 
         pass 
        ws.write(rowx, colx, value) 
+0

Der beste Weg !! Danke. – JPC

Verwandte Themen