在python脚本中将excel文件更改为csv?

Posted

技术标签:

【中文标题】在python脚本中将excel文件更改为csv?【英文标题】:Changing excel file to csv inside python script? 【发布时间】:2017-03-11 18:21:15 【问题描述】:

我正在尝试将 excel 文件列表更改为 csv,然后再将它们加载到 pandas 数据框,但我不确定如何在脚本中转换它们。 Csvkit 和 xlsx2csv 似乎可以从命令行执行此操作,但是当我尝试像这样启动子进程时

for filename in sorted_files:
file = subprocess.Popen("in2csv filename", stdout=subprocess.PIPE)
print file.stdout
dataframe = pd.read_csv(file)

我收到了错误

IOError: 预期的文件路径名或类似文件的对象,得到类型 当格式为“固定”时,架构不能为空

是否可以从子进程获取输出并将其通过管道传输到数据帧?非常感谢任何帮助!

【问题讨论】:

为什么不直接将 Excel 文件读入 pandas 数据框?无需先转换为 CSV 因为 read_csv 是用优化的 c 编写的,而 read_excel 使用的是 xlrd 【参考方案1】:

虽然问题已经很久了,但我遇到了同样的问题,这是在 python 脚本中实现的方式: 只能使用 sheetid 参数执行 Xlsx2csv。为了获取工作表名称和 ID,使用了 get_sheet_details。 csvfrmxlsx 为父目录下 csv 文件夹中的每个工作表创建 csv 文件。

import pandas as pd
from pathlib import Path


def get_sheet_details(filename):
    import xmltodict
    import shutil
    import zipfile
    sheets = []
    # Make a temporary directory with the file name
    directory_to_extract_to = (filename.with_suffix(''))
    directory_to_extract_to.mkdir(parents=True, exist_ok=True)
    # Extract the xlsx file as it is just a zip file
    zip_ref = zipfile.ZipFile(filename, 'r')
    zip_ref.extractall(directory_to_extract_to)
    zip_ref.close()
    # Open the workbook.xml which is very light and only has meta data, get sheets from it
    path_to_workbook = directory_to_extract_to / 'xl' / 'workbook.xml'
    with open(path_to_workbook, 'r') as f:
        xml = f.read()
        dictionary = xmltodict.parse(xml)
        for sheet in dictionary['workbook']['sheets']['sheet']:
            sheet_details = 
                'id': sheet['@sheetId'],  # can be sheetId for some versions
                'name': sheet['@name']  # can be name
            
            sheets.append(sheet_details)
    # Delete the extracted files directory
    shutil.rmtree(directory_to_extract_to)
    return sheets


def csvfrmxlsx(xlsxfl, df):  # create csv files in csv folder on parent directory
from xlsx2csv import Xlsx2csv
(xlsxfl.parent / 'csv').mkdir(parents=True, exist_ok=True)
for index, row in df.iterrows():  
    shnum = row['id']
    shnph = xlsxfl.parent / 'csv' / Path(row['name'] + '.csv')  # path for converted csv file
    Xlsx2csv(str(xlsxfl), outputencoding="utf-8").convert(str(shnph), sheetid=int(shnum))  
return


pthfnc = 'c:/xlsx/'
wrkfl = 'my.xlsx'
xls_file = Path(pthfnc + wrkfl)
sheetsdic = get_sheet_details(xls_file)  # dictionary with sheet names and ids without opening xlsx file
df = pd.DataFrame.from_dict(sheetsdic)
csvfrmxlsx(xls_file, df)  # df with sheets to be converted

【讨论】:

以上是关于在python脚本中将excel文件更改为csv?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中将 Azure Blob 文件 CSV 转换为 Excel

在 python 中将多个 excel '.xlsx' 转换为 '.csv' 文件时,我得到了额外的列?

在PHP中将EXCEL文件转换为CSV文件[重复]

如何通过在 Python 中将两个列表合并为一个,使用 CSV 模块或 Pandas 写入 csv 或 Excel 文件?

将Excel文件转为csv文件的python脚本

如何将MYSQL中数据导出到EXCEL表中 python 脚本?