如何将Excel工作表保存为CSV格式

32
我想编写一个Python脚本,可以读取Excel电子表格并将其中的一些工作表保存为CSV文件。
我已经找到了第三方模块,可以从Python中读取和写入Excel文件,但据我所知,它们只能将文件保存为Excel格式(即*.xls)。如果我在这里错了,请提供一些示例代码,以展示如何使用这些模块来实现我想做的事情。
我还发现了一个解决方案,但我无法完全理解它,而且似乎是针对Windows的,因此无论如何都不能帮助我,因为我想在Unix上执行此操作。无论如何,我不确定这个解决方案是否可以扩展到执行我想要的操作,即使在Windows下也不行。
5个回答

64

使用这两个库的最基本示例,每行描述如下:

  1. 打开xls工作簿
  2. 引用第一个电子表格
  3. 以二进制写模式打开目标csv文件
  4. 创建默认的csv写入器对象
  5. 循环遍历第一个电子表格的所有行
  6. 将行转储到csv中

import xlrd
import csv

with xlrd.open_workbook('a_file.xls') as wb:
    sh = wb.sheet_by_index(0)  # or wb.sheet_by_name('name_of_the_sheet_here')
    with open('a_file.csv', 'wb') as f:   # open('a_file.csv', 'w', newline="") for python 3
        c = csv.writer(f)
        for r in range(sh.nrows):
            c.writerow(sh.row_values(r))

import openpyxl
import csv

wb = openpyxl.load_workbook('test.xlsx')
sh = wb.active
with open('test.csv', 'wb') as f:  # open('test.csv', 'w', newline="") for python 3
    c = csv.writer(f)
    for r in sh.rows:
        c.writerow([cell.value for cell in r])

1
使用 openpyxl 评估 Excel 公式:wb = openpyxl.load_workbook('test.xlsx', data_only=True) - Leonid
@Zeugma 我该如何将这个csv文件写回到文件夹中?(在我的情况下是aws s3)我一直收到AttributeError: '_io.TextIOWrapper'对象没有'save'属性的错误提示。 - pdangelo4

18

使用 pandas 会更简短:

import pandas as pd

df = pd.read_excel('my_file', sheet_name='my_sheet_name')  # sheet_name is optional
df.to_csv('output_file_name', index=False)  # index=False prevents pandas from writing a row index to the CSV.

# oneliner
pd.read_excel('my_file', sheetname='my_sheet_name').to_csv('output_file_name', index=False)

2
我不相信pandas能做到这一点。它一直在转换我的前导零。 - rrs
你能提供更多的细节吗? - FabienP
2
这个实现在我的场景下完美地工作,只需要将 sheetname 改为 sheet_name,因为这是一个打字错误。 - Keivan Ipchi Hagh
@rrs 为什么不使用 pd.read_excel('my_file', dtype=str)?更多信息请参见这里 - Joey Baruch

16
自2021年12月和Python 3以来: openpyxl API已经发生了相当大的变化(请参见https://openpyxl.readthedocs.io/en/stable/usage.html),我已根据@Boud(现在是@Zeugma?)的回答进行了更新。
import openpyxl
import csv

wb = openpyxl.load_workbook('test.xlsx')
sh = wb.active # was .get_active_sheet()
with open('test.csv', 'w', newline="") as file_handle:
    csv_writer = csv.writer(file_handle)
    for row in sh.iter_rows(): # generator; was sh.rows
        csv_writer.writerow([cell.value for cell in row])

@Leonid提供了一些有用的评论-特别是:

csv.writer提供了一些附加选项,例如自定义分隔符:

csv_writer = csv.writer(fout, delimiter='|', quotechar='"', quoting=csv.QUOTE_MINIMAL)

HTH


2
这里有几个打字错误。"with"需要在末尾加上"as f",而"sh.iter_rows"应该是"sh.iter_rows()"。除此之外,工作得很好,谢谢! - eakst7
1
@eakst7 非常感谢 - 你能相信我打出来了吗 - 现在已经修复了 - 很高兴它有帮助。 - jtlz2
1
谢谢,这很有用。我有两个评论:1. pylama 不喜欢单个字母的变量名,而对 csv.writer 的调用提供了额外的选项(如自定义分隔符),这将很酷。例如:csv_writer = csv.writer(fout, delimiter='|', quotechar='"', quoting=csv.QUOTE_MINIMAL) - Leonid
1
@Leonid 非常感谢 - 根据您的有益评论进行了更新! - jtlz2

5
使用xlrdopenpyxl模块分别读取xls或xlsx文档,使用csv模块进行写入。
另外,如果使用Jython,可以使用Apache POI库来读取.xls.xlsx文件,而本机CSV模块仍然可用。

3
如果您需要读取 .xlsx 文件,请使用 openpyxl - Steven Rumbalski
我更喜欢使用xlsxrd来读取.xlsx文件。在某个时候,它将被合并到xlrd中。 - John Y

0
首先将你的 Excel 电子表格读入 Pandas。下面的代码将把你的 Excel 电子表格作为 OrderedDict 导入到 Pandas 中,其中包含所有工作表作为 DataFrames。然后,只需使用 `worksheet_name` 作为键来访问特定工作表作为 DataFrame,并通过使用 `df.to_csv()` 将所需的工作表保存为 csv 文件。希望这在你的情况下能够起作用。
import pandas as pd
df = pd.read_excel('YourExcel.xlsx', sheet_name=None)
df['worksheet_name'].to_csv('output.csv')  

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