如何使用Python将多个Excel表格转换为CSV

6

我希望将所有的Excel文档(.xls)表格转换成CSV格式。如果Excel文档只有一个表格,那么我会按照以下方式进行转换-

   wb = open_workbook(path1)
    sh = wb.sheet_by_name('Sheet1')
    csv_file = open(path2, 'w')
    wr = csv.writer(csv_file, quoting=csv.QUOTE_ALL)
    for rownum in range(sh.nrows):
        wr.writerow(sh.row_values(rownum))
    csv_file.close()

如果我的Excel(.xls)文件有多个工作表,例如('Sheet1', 'Sheet2', 'Sheet3', 'Sheet4'),那么如何将所有工作表转换为CSV格式。

非常感谢你的帮助。


对于像我这样的新手,解决方案需要安装“pip” >> sudo apt install pip。之后执行“pip install pandas”,然后执行“pip install openpyxl”,然后您就可以按照答案中编写的代码进行操作了。 - user734028
7个回答

9
我的理解是您想要为每个工作表获取一个CSV文件。
您可以通过执行以下操作来实现:
excel_file = 'data/excel_file.xlsx'
all_sheets = pd.read_excel(excel_file, sheet_name=None)
sheets = all_sheets.keys()

for sheet_name in sheets:
    sheet = pd.read_excel(excel_file, sheet_name=sheet_name)
    sheet.to_csv("data/%s.csv" % sheet_name, index=False)

如果您确实希望将所有工作表合并为一个CSV文件,则它们都需要具有相同的列名称。您可以执行以下操作将所有CSV文件连接成一个文件:
import glob
import os
all_files = glob.glob(os.path.join("data", "*.csv"))
df_from_each_file = (pd.read_csv(f, sep=',') for f in all_files)
df_merged = pd.concat(df_from_each_file, ignore_index=True)
df_merged.to_csv( "data/merged.csv")

第二个片段的来源


1
你正在循环多次读取Excel文件,这会导致严重的开销。 - hafiz031

8
我在Anaconda环境中使用python3.x,在我的情况下,文件名为“INDIA-WMS.xlsx”,其中包含40个不同的工作表。以下代码将创建40个不同的csv文件,命名为Excel文件的工作表名称,例如'key.csv'。希望这能解决你的问题。
    import pandas as pd
    df = pd.read_excel('INDIA-WMS.xlsx', sheet_name=None)  
    for key in df.keys(): 
        df[key].to_csv('%s.csv' %key)

例如,如果您有不同的工作表,比如'Sheet1','Sheet2','Sheet3'等,则上面的代码将创建不同的csv文件,如'Sheet1.csv','Sheet2.csv','Sheet3.csv'。这里的“key”是您的Excel工作簿的工作表名称。如果您想使用工作表内的数据内容,可以使用for循环,如下所示:for key, value in df.items():

谢谢@Ashu007,但是当我尝试循环时,会出现“TypeError:'DataFrame'对象是可变的,因此它们无法被哈希”的错误。 - Jonathan
2
我不得不根据@sclark的下面的答案将df.items()更改为df.keys()。 - Jonathan

4
使用wb.sheet_names()获取所有工作表的名称,然后循环并动态地将名称放入sheet_name中。

3

我按照 Ashu007 的解决方案操作,但在 Python3.9 和 Pandas 1.2.0 中,我需要将 df.items() 更改为 df.keys(),如下所示:

import pandas as pd
df = pd.read_excel('file_name.xlsx', sheet_name=None)  
for key in df.keys(): 
    df[key].to_csv('{}.csv'.format(key))

谢谢,我一直在想为什么 Ashu007 的代码不能运行。感谢您的更新。 - Jonathan

2
您可以尝试以下代码,这适用于我。
import pandas as pd
data = pd.read_excel('sample1.xlsx', sheet_name=None)

# loop through the dictionary and save csv
for sheet_name, df in data.items():
df.to_csv(f'{sheet_name}.csv')

1
我遇到了一个类似的问题,需要将一个Excel文件中的多个工作表列在一个工作表中,然后再转换为.csv格式。请注意,“PC”和“PC_City.xlsx”这些术语只是我正在处理的降水数据的标签。
以下是解决方法:
import pandas as pd

excel_file = r'C:\Users\yourpath\PC_City.xlsx'
df = pd.read_excel(excel_file, sheetname=None)
xlsx = pd.ExcelFile(excel_file)
PC_sheets = []
for sheet in xlsx.sheet_names:
    PC_sheets.append(xlsx.parse(sheet))
    PC = pd.concat(PC_sheets)

PC.to_csv('PC_City.csv', encoding='utf-8', index=False)   

我刚开始学习编程,可能有更好的方法。希望这能有所帮助。


0
import pandas as pd

df = pd.read_excel('data.xlsx', sheet_name=None)  
for key in df: 
   df[key].to_csv('%s.csv' %key)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接