54

.xlsx および .xls ファイルを .csv に変換するために、python で win32.client を使用しています。このコードを実行すると、エラーが発生します。私のコードは次のとおりです。

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

このコードでエラーを見つけることができません。助けてください。

4

14 に答える 14

77

私はxlrdを使用します-それはより高速で、クロスプラットフォームであり、ファイルを直接操作します。

バージョン0.8.0以降、xlrdXLSファイルとXLSXファイルの両方を読み取ります。

ただし、バージョン2.0.0以降、サポートはXLSのみに削減されました。

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()
于 2012-03-27T06:43:58.417 に答える
22

xlrd (xls の場合) と openpyxl (xlsx の場合) を使用して、ほぼすべての表形式データを csv に変換する csvkit を使用します

インストールが完了したら、その依存関係とともに、次の問題があります。

python in2csv myfile > myoutput.csv

すべての形式検出の問題を処理するため、ほぼすべての表形式データ ソースを渡すことができます。クロスプラットフォームでもあります (win32 に依存しません)。

于 2012-03-27T08:42:30.733 に答える
3

xlsx2csvはpandas や xlrd よりも高速です。

xlsx2csv -s 0 crunchbase_monthly_.xlsx cruchbase

通常、Excel ファイルには n シート名が付いています。

-s is sheetname index.

次に、cruchbase フォルダーが作成され、xlsx に属する各シートが 1 つの csv に変換されます。

ps csvkitも素晴らしいです。

于 2016-11-02T05:50:46.350 に答える
3

@andi私はあなたのコードをテストしましたが、うまくいきますが、

私のシートには、このような列があります

2013-03-06T04:00:00

同じセル内の日付と時刻

エクスポート時に文字化けします、エクスポートされたファイルではこのようになっています

41275.0416667

他の列は問題ありません。

反対側のcsvkitは、その列で問題ありませんが、1つのシートしかエクスポートせず、私のファイルには多くのシートがあります。

于 2015-01-20T19:00:49.623 に答える
0

xlrd を使用すると、Excel の日付形式が失われるため、これを行うには欠陥のある方法です。

私のユースケースは次のとおりです。

複数のシートを含む Excel ファイルを取得し、それぞれを独自のファイルに変換します。

xlsx2csv ライブラリを使用してこれを行い、サブプロセスを使用してこれを呼び出しました。

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()
于 2016-11-13T19:45:32.453 に答える