读取一个目录中的多个excel文件并将其转换为另一个目录中的.csv文件的Python脚本

yxyvkwin  于 2023-01-01  发布在  Python
关注(0)|答案(1)|浏览(135)

我对python和Stackoverflow比较陌生,但希望任何人都能对我目前的问题有所了解。我有一个python脚本,可以接收excel文件(.xls和.xlsx),并将它们转换为.csv文件到另一个目录。它在我的示例excel文件上工作得非常好(由4列和1行组成,用于测试目的),但当我尝试对包含excel文件的其他目录运行脚本时(文件大很多)我得到一个Assert错误。我已经附上了我的代码和错误。期待有一些指导这个问题。谢谢!

import os
import pandas as pd

source = "C:/.../TestFolder"
output = "C:/.../OutputCSV"

dir_list = os.listdir(source)

os.chdir(source)

for i in range(len(dir_list)):
    filename = dir_list[i]
    book = pd.ExcelFile(filename)

    #writing to csv
    if filename.endswith('.xlsx') or filename.endswith('.xls'):
        for i in range(len(book.sheet_names)):
            df = pd.read_excel(book, book.sheet_names[i])

            os.chdir(output)

            new_name = filename.split('.')[0] + str(book.sheet_names[i])+'.csv'
            df.to_csv(new_name, index = False)

        os.chdir(source)

print "New files: ", os.listdir(output)

n1bvdmb6

n1bvdmb61#

由于您使用Windows,请考虑使用Jet/ACE SQL引擎(Windows .dll文件)来查询Excel工作簿并导出到CSV文件,从而绕过使用Pandas Dataframe 加载/导出的需求。
具体来说,使用pyodbc建立到Excel文件的ODBC连接,使用SELECT * INTO ... SQL操作查询迭代每个工作表并导出到csv文件。openpyxl模块用于检索工作表名称。下面的脚本不依赖于相对路径,因此可以从任何地方运行。假设每个Excel文件都有完整的标题列(在顶行的使用范围内没有缺失的单元格)。

import os
import pyodbc
from openpyxl import load_workbook

source = "C:/Path/To/TestFolder"
output = "C:/Path/To/OutputCSV"

dir_list = os.listdir(source)

for xlfile in dir_list:
    strfile = os.path.join(source, xlfile)

    if strfile.endswith('.xlsx') or strfile.endswith('.xls'):
        # CONNECT TO WORKBOOK
        conn = pyodbc.connect(r'Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};' + \
                               'DBQ={};'.format(strfile), autocommit=True)
        # RETRIEVE WORKBOOK SHEETS
        sheets = load_workbook(filename = strfile, use_iterators = True).get_sheet_names()

        # ITERATIVELY EXPORT SHEETS TO CSV IN OUTPUT FOLDER
        for s in sheets:
            outfile = os.path.join(output, '{0}_{1}.csv'.format(xlfile.split('.')[0], s))
            if os.path.exists(outfile): os.remove(outfile)

            strSQL = " SELECT * " + \
                     " INTO [text;HDR=Yes;Database={0};CharacterSet=65001].[{1}]" + \
                     " FROM [{2}$]"            
            conn.execute(strSQL.format(output, os.path.basename(outfile, s))
        conn.close()

**注意:此过程创建一个schema.ini文件,该文件与每个迭代连接。可以删除。

相关问题