programing

xls-csv 변환기

newnotes 2023. 4. 10. 22:12
반응형

xls-csv 변환기

python에서 win32.client를 사용하여 .xlsx 및 .xls 파일을 .csv로 변환하고 있습니다.이 코드를 실행하면 오류가 발생합니다.암호는 다음과 같습니다.

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

이 코드에서 오류를 찾을 수 없습니다.제발 도와주세요.

xlrd를 사용하고 싶습니다.xlrd는 고속으로 크로스 플랫폼이 되어 파일을 직접 조작할 수 있습니다.

버전 0.8.0에서는xlrdXLS XLS XLS XX XLS XLX XLX の 다다다다다 。

그러나 버전 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()

나는 사용할 것이다.pandas처리속도를 높이기 위해 계산량이 많은 부분은 cython 또는 c-extensions로 작성되어 있으며 구문은 매우 깨끗합니다.를 들어 파일 "에서 "your_csv.변환하려면 "your_workbook.xls"를 합니다.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하다

어쩌면 누군가 바로 사용할 수 있는 이 코드 조각을 유용하게 여길지도 몰라Excel 워크북의 모든 스프레드시트에서 CSV를 생성할 수 있습니다.

여기에 이미지 설명 입력

Python 2:

# -*- 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(u'{}.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])

Python 3:

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(u'{}.csv'.format(worksheet_name), 'w', encoding="utf-8") as your_csv_file:
            wr = csv.writer(your_csv_file, quoting=csv.QUOTE_ALL)
            for rownum in range(worksheet.nrows):
                wr.writerow(worksheet.row_values(rownum))

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

xlrd(xls의 경우)와 openpyxl(xlsx의 경우)을 사용하여 거의 모든 표 형식의 데이터를 csv로 변환합니다.

인스톨 하면, 그 의존성에 의해서, 다음의 문제가 발생합니다.

python in2csv myfile > myoutput.csv

포맷 검출의 모든 문제가 해결되기 때문에 임의의 표 형식의 데이터 소스에 전달할 수 있습니다.크로스 플랫폼이기도 합니다(win32 의존관계 없음).

먼저 Excel 스프레드시트를 판다로 읽어 보십시오. 아래 코드는 모든 워크시트를 데이터 프레임으로 포함하는 OrderedDict 유형으로 Excel 스프레드시트를 판다로 가져옵니다.그런 다음 worksheet_name을 키로 사용하여 특정 워크시트에 데이터 프레임으로 액세스하고 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 파일에 워크시트가 하나만 포함되어 있는 경우 아래 코드를 사용하십시오.

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 워크북의 여러 Excel 시트에서 여러 csv 파일 변환기로 작동합니다.여기서 key는 시트 이름이고 value는 시트 내부 내용입니다.

@andi 코드를 테스트했습니다만, 잘 동작합니다만,

내 침대 시트에 이런 칼럼이 있어

2013-03-06T04:00:00

같은 셀 내의 날짜와 시각

내보내는 동안 왜곡됩니다. 내보낸 파일의 경우와 같습니다.

41275.0416667

다른 컬럼은 정상입니다.

반면 csvkit은 그 컬럼에 문제가 없지만 하나의 시트만 내보내고 내 파일에는 많은 시트가 있습니다.

xlsx2csv판다와 xlrd보다 빠르다.

xlsx2csv -s 0 crunchbase_monthly_.xlsx cruchbase

보통 excel 파일에는 n개의 시트 이름이 붙습니다.

-s is sheetname index.

그러면 cruchbase 폴더가 생성되고 xlsx에 속한 각 시트가 단일 csv로 변환됩니다.

p.s. csvkit도 멋져요.

여러 개의 시트가 포함된 워크북을 다루는 Scott Ming의 답변을 인용합니다.

여기 python 스크립트 getsheets.py(미러)가 있습니다.설치해주세요.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()

Python의 Panda lib를 사용하여 xls 파일을 csv 파일로 변환할 수 있습니다.아래 코드는 xls 파일을 csv 파일로 변환합니다.pd로서 panda를 Import합니다.

로컬 경로에서 Excel 파일 읽기:

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

열에 있는 트리밍 공간:

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

인덱스 없이 파이프 기호로 구분되는 CSV 파일로 데이터 프레임 보내기:

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

Python은 이 작업에 가장 적합한 도구가 아닙니다.Python에서 몇 가지 방법을 시도했지만 모두 100% 작동하지 않습니다(예를 들어 10%가 0.1로 변환되거나 열 유형이 엉망이 되는 등).여기서 가장 적합한 툴은 PowerShell입니다.MS 제품(Excel과 마찬가지로)이며 최고의 통합 기능을 갖추고 있기 때문입니다.

이 PowerShell 스크립트를 다운로드하고 줄 47을 편집하여 Excel 파일이 포함된 폴더의 경로를 입력한 후 PowerShell을 사용하여 스크립트를 실행합니다.

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

나는 모든 질문자를 테스트해봤지만, 그들은 모두 나에게 너무 느렸다.Excel이 설치되어 있으면 COM을 사용할 수 있습니다.

처음에는 실제 Excel 어플리케이션으로 모든 것을 로딩하기 때문에 느릴 것으로 생각했지만, 큰 파일은 아닙니다.아마도 파일을 열고 저장하는 알고리즘이 고도로 최적화된 컴파일된 코드를 실행했기 때문에 마이크로소프트는 결국 많은 돈을 벌게 될 것입니다.

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

이것은 매우 원시적인 코드이며 오류나 인쇄 도움말 같은 것은 체크하지 않습니다. 함수에 입력한 패턴에 맞는 각 파일의 csv 파일을 생성하기만 하면 되기 때문에 많은 파일을 일괄 처리할 수 있습니다.Excel 어플리케이션을 한 번만 실행할 수 있습니다.

크로스 플랫폼이 아닌 Windows Excel 전용 소프트웨어에 의존하는 것은 싫지만,csvkit.xls의 경우,xlrd후드에서 날짜를 올바르게 해석하지 못했습니다(명령줄 매개 변수를 사용하여 strptime 형식을 지정하는 경우에도 마찬가지).

를 들어 이 xls 파일은 다음과 같이 해석할 때csvkit는 셀을 변환합니다.G112/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 __name__ == '__main__':
    self = CsvConverter(
        input_dir='C:\\data\\xls\\',
        output_dir='C:\\data\\csv\\'
    )

    self.batchConvertXlsToCsv()

상기의 경우input_dir.xls가 포함되어 출력됩니다.output_dir.csv --로 지정됩니다.assert.xls에는 공백이 아닌 시트가 1장 있습니다.여러 시트를 여러 csv로 처리해야 하는 경우 편집이 필요합니다.saveWorkbookAsCsv.

내가 쓰려고 했는데xlrd포맷을 변환하기 위한 라이브러리xlsx안으로csv에러가 발생하고 있습니다.xlrd.biffh.XLRDError: Excel xlsx file; not supported이 패키지가 더 이상 다른 포맷을 읽을 수 없기 때문에 발생한 현상입니다.xlsxlrd 매뉴얼에 따릅니다.

Chris Withers의 답변에 따라 나는 그 기능의 엔진을 바꿀 수 있었다.read_excel()부터pandas그리고 당신이 원하는 Excel 스프레드시트의 시트를 변환하는 기능을 만들 수 있었습니다.
아래 기능을 작동시키려면 , 잊지 말고openpyxl여기서부터 도서관.

기능:

import os
import pathlib
import pandas as pd

# Function to convert excel spreadsheet into csv format
def Excel_to_csv():
    # Excel file full path
    excel_file = os.path.join(os.path.sep, pathlib.Path(__file__).parent.resolve(), "Excel_Spreadsheet.xlsx")    
    # Excel sheets
    excel_sheets = ['Sheet1', 'Sheet2', 'Sheet3']

    for sheet in excel_sheets:
        # Create dataframe for each sheet
        df = pd.DataFrame(pd.read_excel(excel_file, sheet, index_col=None, engine='openpyxl'))
        # Export to csv. i.e: sheet_name.csv
        df.to_csv(os.path.join(os.path.sep, pathlib.Path(__file__).parent.resolve(), sheet + '.csv'), sep=",", encoding='utf-8', index=False, header=True)

# Runs the excel_to_csv function:
Excel_to_csv()

언급URL : https://stackoverflow.com/questions/9884353/xls-to-csv-converter

반응형