web-dev-qa-db-ja.com

xlsからcsvへのコンバーター

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

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

47
Lalit Chattar

私はxlrdを使用します-それはより速く、クロスプラットフォームであり、ファイルで直接動作します。 注意すべき点が1つあります。xlsxファイルでは機能しません。したがって、Excelファイルをxlsとして保存する必要があります。 編集:バージョン0.8.0以降、xlrdはXLSファイルとXLSXファイルの両方を読み取ります。

 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()
62
Ben Hughes

pandasを使用します。計算量の多い部分は、プロセスを高速化するためにcythonまたはc-extensionsで記述されており、構文は非常にクリーンです。たとえば、ファイル「your_workbook.xls」からファイル「your_csv.csv」に「Sheet1」を変換する場合は、トップレベル関数read_Excelおよびメソッドto_csv次からDataFrameクラスから:

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

設定encoding='utf-8'は、他の回答で言及されたUnicodeEncodeErrorを軽減します。

44
philE

誰かがこのすぐに使えるコードを役に立つと思うかもしれません。 Excelのブック内のすべてのスプレッドシートからCSVを作成できます。

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 __== "__main__":
    csv_from_Excel(sys.argv[1])
34
andilabs

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

依存関係とともにインストールすると、次の問題が発生します。

python in2csv myfile > myoutput.csv

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

21
wombat

xlsx2csv isfasterpandas and xlrd。

xlsx2csv -s 0 crunchbase_monthly_.xlsx cruchbase

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

-s is sheetname index.

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

追伸 csvkit も素晴らしい。

3
CodeFarmer

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

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

2013-03-06T04:00:00

同じセル内の日付と時刻

エクスポート中に文字化けします。エクスポートされたファイルでは次のようになります。

41275.0416667

他の列は大丈夫です。

一方、csvkitはその列では問題ありませんが、1つのシートのみをエクスポートし、ファイルには多くのファイルがあります。

3
user1632812

answer from Scott Ming を引用します。これは、複数のシートを含むワークブックで機能します。

ここにpython script getsheets.pymirror )、pandasおよびxlrdをインストールする必要がありますあなたはそれを使用します。

これを実行します:

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

どのように機能しますか?

$ 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.

複数のxlsxに変換します:

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

All Done!

いくつかのcsvに変換します。

$ 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()
1

まず、Excelスプレッドシートをパンダに読み込みます。以下のコードは、Excelスプレッドシートをpandasにインポートし、すべてのワークシートをデータフレームとして含むOrderedDictタイプとしてインポートします。 df.to_csv()を使用して、データフレームとして必要なワークシートのみをcsvファイルとして保存します。

import pandas as pd
df = pd.read_Excel('YourExcel.xlsx', sheet_name=None)
df['worksheet_name'].to_csv('YourCsv.csv')  

Excelファイルにワークシートが1つしか含まれていない場合は、次のコードを使用します。

import pandas as pd
df = pd.read_Excel('YourExcel.xlsx')
df.to_csv('YourCsv.csv') 

誰かがすべてのExcelワークシートを単一のExcelブックから別のcsvファイルに変換する場合は、以下のコードを試してください。

import pandas as pd
def excelTOcsv(filename):
    df = pd.read_Excel(filename, sheet_name=None)  
    for key, value in df.items(): 
        return df[key].to_csv('%s.csv' %key)

この関数は、同じExcelブックから複数のCSVファイルコンバーターへの複数のExcelシートとして機能しています。 keyはシート名で、valueはシート内のコンテンツです。

1
Ashu007

クロスプラットフォームではないWindows Excel独自のソフトウェアに依存するのは嫌いですが、内部でcsvkitを使用する.xlsのxlrdのテストでは、日付を正しく解析できませんでした(コマンドラインパラメータを使用してstrptime形式を指定する場合でも)。

たとえば、 このxlsファイル は、csvkitで解析されると、セルG1 of 12/31/2002から37621、Excelからcsvに変換する場合-> save_as(以下を使用)セルG1"December 31, 2002"

import re
import os
from win32com.client import Dispatch
xlCSVMSDOS = 24

class CsvConverter(object):
    def __init__(self, *, input_dir, output_dir):
        self._Excel = None
        self.input_dir = input_dir
        self.output_dir = output_dir

        if not os.path.isdir(self.output_dir):
            os.makedirs(self.output_dir)

    def isSheetEmpty(self, sheet):
        # https://archive.is/RuxR7
        # WorksheetFunction.CountA(ActiveSheet.UsedRange) = 0 And ActiveSheet.Shapes.Count = 0

        return \
            (not self._Excel.WorksheetFunction.CountA(sheet.UsedRange)) \
            and \
            (not sheet.Shapes.Count)

    def getNonEmptySheets(self, wb, as_name=False):
        return [ \
            (sheet.Name if as_name else sheet) \
            for sheet in wb.Sheets \
            if not self.isSheetEmpty(sheet) \
        ]

    def saveWorkbookAsCsv(self, wb, csv_path):
        non_empty_sheet_names = self.getNonEmptySheets(wb, as_name=True)

        assert (len(non_empty_sheet_names) == 1), \
            "Expected exactly 1 sheet but found %i non-empty sheets: '%s'" \
            %(
                len(non_empty_sheet_names),
                "', '".join(name.replace("'", r"\'") for name in non_empty_sheet_names)
            )

        wb.Worksheets(non_empty_sheet_names[0]).SaveAs(csv_path, xlCSVMSDOS)
        wb.Saved = 1

    def isXlsFilename(self, filename):
        return bool(re.search(r'(?i)\.xls$', filename))

    def batchConvertXlsToCsv(self):
        xls_names = Tuple( filename for filename in next(os.walk(self.input_dir))[2] if self.isXlsFilename(filename) )

        self._Excel = Dispatch('Excel.Application')
        try:
            for xls_name in xls_names:
                csv_path = os.path.join(self.output_dir, '%s.csv' %os.path.splitext(xls_name)[0])
                if not os.path.isfile(csv_path):
                    workbook = self._Excel.Workbooks.Open(os.path.join(self.input_dir, xls_name))
                    try:
                        self.saveWorkbookAsCsv(workbook, csv_path)
                    finally:
                        workbook.Close()
        finally:
            if not len(self._Excel.Workbooks):
                self._Excel.Quit()

            self._Excel = None

if __== '__main__':
    self = CsvConverter(
        input_dir='C:\\data\\xls\\',
        output_dir='C:\\data\\csv\\'
    )

    self.batchConvertXlsToCsv()

上記にはinput_dir .xlsを含み、output_dir as .csv-.xlsに空でないシートがちょうど1つあることをassertします。複数のシートを複数のcsvに処理する必要がある場合は、saveWorkbookAsCsvを編集する必要があります。

0
user2426679

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()
0
Ryan Dewar

Pandas= lib of Pythonを使用して、xlsファイルをcsvファイルに変換します。以下のコードは、xlsファイルをcsvファイルに変換します。import pandas pdとして

ローカルパスからExcelファイルを読み取ります。

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

列にあるスペースのトリム:

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

データフレームをCSVファイルに送信します。CSVファイルはパイプシンボルdelimtedで、インデックスなしです。

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

私はすべてのアンワーをテストしましたが、それらはすべて私にとって遅すぎました。 Excelがインストールされている場合は、COMを使用できます。

最初は実際のExcelアプリケーションのすべてをロードするので遅いと思っていましたが、巨大なファイル用ではありません。ファイルを開いたり保存したりするためのアルゴリズムが、大幅に最適化されたコンパイル済みコードを実行するためか、Microsoftの男たちは結局それのために多くのお金を稼ぐのでしょう。

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 __== '__main__':
    main(sys.argv[1])

これは非常に生のコードであり、エラー、印刷ヘルプなどをチェックしません。関数に入力したパターンに一致するファイルごとにcsvファイルを作成するだけなので、Excelアプリケーションを起動するだけで多くのファイルをバッチ処理できます一度。

0
caiohamamura