2012-03-27 7 views
37

Ich benutze win32.client in Python zum Konvertieren meiner .xlsx und .xls Datei in eine .csv. Wenn ich diesen Code ausführe, gibt es einen Fehler. Mein Code ist:xls zu csv converter

def convertXLS2CSV(aFile): 
    '''converts a MS Excel file to csv w/ the same name in the same directory''' 

    print "------ beginning to convert XLS to CSV ------" 

    try: 
     import win32com.client, os 
     from win32com.client import constants as c 
     excel = win32com.client.Dispatch('Excel.Application') 

     fileDir, fileName = os.path.split(aFile) 
     nameOnly = os.path.splitext(fileName) 
     newName = nameOnly[0] + ".csv" 
     outCSV = os.path.join(fileDir, newName) 
     workbook = excel.Workbooks.Open(aFile) 
     workbook.SaveAs(outCSV, c.xlCSVMSDOS) # 24 represents xlCSVMSDOS 
     workbook.Close(False) 
     excel.Quit() 
     del excel 

     print "...Converted " + nameOnly + " to CSV" 
    except: 
     print ">>>>>>> FAILED to convert " + aFile + " to CSV!" 

convertXLS2CSV("G:\\hello.xlsx") 

Ich bin nicht in der Lage, den Fehler in diesem Code zu finden. Bitte helfen Sie.

+2

Bitte posten Sie den Fehler und volle Taceback – agf

+7

entferne den try/except zuerst, du wirst keinen hilfreichen Fehler erhalten. – SpliFF

Antwort

50

Ich würde xlrd verwenden - es ist schneller, Cross-Plattform und arbeitet direkt mit der Datei. Eine Sache zu beachten - es funktioniert nicht auf xlsx-Dateien - so müssten Sie Ihre Excel-Datei als xls speichern. Bearbeiten: Ab Version 0.8.0 liest xlrd sowohl XLS und XLSX-Dateien.

import xlrd 
import csv 

def csv_from_excel(): 

    wb = xlrd.open_workbook('your_workbook.xls') 
    sh = wb.sheet_by_name('Sheet1') 
    your_csv_file = open('your_csv_file.csv', 'wb') 
    wr = csv.writer(your_csv_file, quoting=csv.QUOTE_ALL) 

    for rownum in xrange(sh.nrows): 
     wr.writerow(sh.row_values(rownum)) 

    your_csv_file.close() 
+2

Sollte es nicht "wr.writerow (sh.row_values ​​(rownum))" sein? Siehe [hier] (https://secure.simplistix.co.uk/svn/xlrd/trunk/xlrd/doc/xlrd.html#sheet.Sheet.row_values-method). – kuujo

+2

Unterstützt es datetime Konvertierung von xls datmode zu normalen datetime – sharafjaffri

+0

Neueste Version funktioniert für xlsx-Dateien: https://pypi.python.org/pypi/xlrd/0.9.2 – Jetse

17

würde ich csvkit verwenden, die xlrd verwendet (für xls) und openpyxl (für xlsx) fast jede tabellarische Daten in CSV zu konvertieren.

Einmal installiert, mit seinen Abhängigkeiten, ist es eine Frage von:

python in2csv myfile > myoutput.csv 

Es kümmert sich um alle Formaterkennung Probleme nimmt, so dass Sie es fast jede tabellarische Datenquelle passieren kann. Es ist auch plattformübergreifend (keine win32-Abhängigkeit).

+0

Wie dieses Werkzeug auch. Nicht ganz relevant für diese Frage, aber ich habe eine Erwähnung dieser csvkit-Sache in [diesem Buch] (http://shop.oreilly.com/product/0636920032823.do) zusammen mit einigen anderen Datenverarbeitungs-Utils getroffen, die Ihnen erlauben um Daten direkt in Ihrer Shell zu transformieren. – devforfu

27

Vielleicht findet jemand diesen gebrauchsfertigen Code nützlich. Es ermöglicht das Erstellen von CSVs aus allen Tabellen in Excel Arbeitsmappe.

enter image description here

# -*- coding: utf-8 -*- 
import xlrd 
import csv 
from os import sys 

def csv_from_excel(excel_file): 
    workbook = xlrd.open_workbook(excel_file) 
    all_worksheets = workbook.sheet_names() 
    for worksheet_name in all_worksheets: 
     worksheet = workbook.sheet_by_name(worksheet_name) 
     with open('{}.csv'.format(worksheet_name), 'wb') as your_csv_file: 
      wr = csv.writer(your_csv_file, quoting=csv.QUOTE_ALL) 
      for rownum in xrange(worksheet.nrows): 
       wr.writerow([unicode(entry).encode("utf-8") for entry in worksheet.row_values(rownum)]) 

if __name__ == "__main__": 
    csv_from_excel(sys.argv[1]) 
+0

nur ein paar Anmerkungen: einige Arbeitsblätter sind möglicherweise leer. Ich sehe kein Dienstprogramm zum Generieren von leeren CSV-Dateien, besser eine vorherige Auswertung auf Arbeitsblatt.nrows> 0, bevor Sie anything tun. –

+0

auch, wäre es besser, Kontexte für die CSV-Datei zu verwenden;) –

+1

Sie können leere Blätter mit 'if Arbeitsblatt.nrows == 0: fortfahren ' – duhaime

25

würde ich pandas verwenden. Die rechenintensiven Teile sind in Cython oder C-Extensions geschrieben, um den Prozess zu beschleunigen und die Syntax ist sehr sauber. Zum Beispiel, wenn Sie „Tabelle1“ aus der Datei „your_workbook.xls“ in die Datei „your_csv.csv“ aktivieren möchten, verwenden Sie nur die Top-Level-Funktion read_excel und die Methode to_csv aus der DataFrame Klasse wie folgt:

import pandas as pd 
data_xls = pd.read_excel('your_workbook.xls', 'Sheet1', index_col=None) 
data_xls.to_csv('your_csv.csv', encoding='utf-8') 

Einstellung encoding='utf-8' lindert die UnicodeEncodeError in anderen Antworten erwähnt.

+0

es funktioniert nicht im Fall, wenn Sie andere Sprachen Text in rows.it haben ?? ? im Text –

+1

@philE Das ist zu langsam. Verwenden Sie xlsx2csv – CodeFarmer

+0

irgendwelche Tipps zum Umgang mit Newline-Zeichen, die in Excel Zelleninhalte sein könnten? – Gyan

2

@andi ich Ihren Code getestet, es funktioniert gut, aber

In meinem Blatt gibt es eine Spalte wie dieses

2013-03-06T04: 00: 00

Datum und Uhrzeit in der gleiche Zelle

es während der Ausfuhr verstümmelt wird, es so in der exportierten Datei ist

41275,0416667

andere Spalten sind in Ordnung.

csvkit, auf der anderen Seite, macht ok mit dieser Spalte, aber exportiert nur ein Blatt, und meine Dateien haben viele.

3

xlsx2csv ist schneller als pandas und xlrd.

xlsx2csv -s 0 crunchbase_monthly_.xlsx cruchbase 

Excel-Datei kommt in der Regel mit n Blattname.

-s is sheetname index. 

dann, cruchbase Ordner erstellt werden soll, gehört jedes Blatt auf eine einzige CSV umgewandelt werden xlsx.

p.s. csvkit ist auch super.

0

Verwenden Sie xlrd ist eine fehlerhafte Möglichkeit, dies zu tun, weil Sie die Datumsformate in Excel verlieren.

Mein Anwendungsfall ist der folgende.

Nehmen Sie eine Excel-Datei mit mehr als einem Blatt und konvertieren Sie jedes in eine eigene Datei.

Ich habe dies mit der xlsx2csv-Bibliothek getan und diese mit einem Subprozess aufgerufen.

import csv 
import sys, os, json, re, time 
import subprocess 

def csv_from_excel(fname): 
    subprocess.Popen(["xlsx2csv " + fname + " --all -d '|' -i -p " 
         "'<New Sheet>' > " + 'test.csv'], shell=True) 

    return 

lstSheets = csv_from_excel(sys.argv[1]) 

time.sleep(3) # system needs to wait a second to recognize the file was written 

with open('[YOUR PATH]/test.csv') as f: 
    lines = f.readlines() 
    firstSheet = True 

    for line in lines: 
     if line.startswith('<New Sheet>'): 
      if firstSheet: 
       sh_2_fname = line.replace('<New Sheet>', '').strip().replace(' - ', '_').replace(' ','_') 
       print(sh_2_fname) 
       sh2f = open(sh_2_fname+".csv", "w") 
       firstSheet = False 
      else: 
       sh2f.close() 
       sh_2_fname = line.replace('<New Sheet>', '').strip().replace(' - ', '_').replace(' ','_') 
       print(sh_2_fname) 
       sh2f = open(sh_2_fname+".csv", "w") 
     else: 
      sh2f.write(line) 
sh2f.close() 
0

Ich habe alle Antworten getestet, aber sie waren alle zu langsam für mich. Wenn Sie Excel installiert haben, können Sie die COM verwenden.

Ich dachte zunächst, es wäre langsamer, da es alles für die eigentliche Excel-Anwendung lädt, aber es ist nicht für große Dateien. Vielleicht, weil der Algorithmus zum Öffnen und Speichern von Dateien einen stark optimierten kompilierten Code ausführt, machen Microsoft-Leute doch eine Menge Geld dafür. Dies ist sehr Rohcode

import sys 
import os 
import glob 
from win32com.client import Dispatch 

def main(path): 
    excel = Dispatch("Excel.Application") 
    if is_full_path(path): 
     process_file(excel, path) 
    else: 
     files = glob.glob(path) 
     for file_path in files: 
      process_file(excel, file_path) 
    excel.Quit() 

def process_file(excel, path): 
    fullpath = os.path.abspath(path) 
    full_csv_path = os.path.splitext(fullpath)[0] + '.csv' 
    workbook = excel.Workbooks.Open(fullpath) 
    workbook.Worksheets(1).SaveAs(full_csv_path, 6) 
    workbook.Saved = 1 
    workbook.Close() 


def is_full_path(path): 
    return path.find(":") > -1 

if __name__ == '__main__': 
    main(sys.argv[1]) 

und prüft nicht für Fehler, Druck Hilfe oder irgendetwas, es wird nur eine CSV-Datei für jede Datei erstellen, die dem Muster entspricht, die Sie in der Funktion eingegeben, so können Sie Batch-Prozess ein Viele Dateien starten nur einmal Excel-Anwendung.

1

einem answer von Scott Ming Zitiert, die mit Arbeitsmappe mit mehreren Blättern funktioniert:

Hier ist ein Python-Skript getsheets.py (mirror), sollten Sie pandas und xlrd installieren, bevor Sie es benutzen. diese

Run:

pip3 install pandas xlrd # or `pip install pandas xlrd` 

Wie funktioniert es?

$ python3 getsheets.py -h 
Usage: getsheets.py [OPTIONS] INPUTFILE 

Convert a Excel file with multiple sheets to several file with one sheet. 

Examples: 

    getsheets filename 

    getsheets filename -f csv 

Options: 
-f, --format [xlsx|csv] Default xlsx. 
-h, --help    Show this message and exit. 

Umrechnen in mehrere xlsx:

$ python3 getsheets.py goods_temp.xlsx 
Sheet.xlsx Done! 
Sheet1.xlsx Done! 

All Done! 

auf mehrere csv konvertieren:

$ python3 getsheets.py goods_temp.xlsx -f csv 
Sheet.csv Done! 
Sheet1.csv Done! 

All Done! 

getsheets.py:

# -*- coding: utf-8 -*- 

import click 
import os 
import pandas as pd 


def file_split(file): 
    s = file.split('.') 
    name = '.'.join(s[:-1]) # get directory name 
    return name 


def getsheets(inputfile, fileformat): 
    name = file_split(inputfile) 
    try: 
     os.makedirs(name) 
    except: 
     pass 

    df1 = pd.ExcelFile(inputfile) 
    for x in df1.sheet_names: 
     print(x + '.' + fileformat, 'Done!') 
     df2 = pd.read_excel(inputfile, sheetname=x) 
     filename = os.path.join(name, x + '.' + fileformat) 
     if fileformat == 'csv': 
      df2.to_csv(filename, index=False) 
     else: 
      df2.to_excel(filename, index=False) 
    print('\nAll Done!') 


CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) 


@click.command(context_settings=CONTEXT_SETTINGS) 
@click.argument('inputfile') 
@click.option('-f', '--format', type=click.Choice([ 
    'xlsx', 'csv']), default='xlsx', help='Default xlsx.') 
def cli(inputfile, format): 
    '''Convert a Excel file with multiple sheets to several file with one sheet. 

    Examples: 

    \b 
     getsheets filename 

    \b 
     getsheets filename -f csv 
    ''' 
    if format == 'csv': 
     getsheets(inputfile, 'csv') 
    else: 
     getsheets(inputfile, 'xlsx') 


cli() 
0

Wir Pandas lib von Python können xls conevert Datei in CSV-Datei Im folgenden Code wird XLS-Datei in CSV-Datei konvertieren. Import Pandas als pd

lesen Excel von Lokaler Pfad Datei:

df = pd.read_excel("C:/Users/IBM_ADMIN/BU GPA Scorecard.xlsx",sheetname=1) 

Trim Spaces, die auf Spalten:

df.columns = df.columns.str.strip() 

Daten senden Rahmen in CSV-Datei, die Symbol wird Rohr delimted und ohne Index:

df.to_csv("C:/Users/IBM_ADMIN/BU GPA Scorecard csv.csv",sep="|",index=False)