如何将Excel工作表另存为CSV

kjo*_*kjo 18 python csv excel

我想编写一个Python脚本,该脚本读入Excel电子表格并将其部分工作表保存为CSV文件.

我怎样才能做到这一点?

我找到了用于从Python读取和编写Excel文件的第三方模块,但据我所知,它们只能以Excel(即*.xls)格式保存文件.如果我在这里错了,一些示例代码显示如何做我正在尝试用这些模块做的事情将不胜感激.

我也遇到了一个我无法理解的解决方案,但似乎是特定于Windows的,因此无论如何都不会帮助我,因为我想在Unix中这样做.无论如何,我不清楚这个解决方案可以扩展到我想做的事情,即使在Windows下也是如此.

Bou*_*oud 44

使用两个库逐行描述的最基本的例子:

  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))
Run Code Online (Sandbox Code Playgroud)
import openpyxl
import csv

wb = openpyxl.load_workbook('test.xlsx')
sh = wb.get_active_sheet()
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])
Run Code Online (Sandbox Code Playgroud)


jtl*_*lz2 16

截至 2021 年 12 月和 Python 3:

\n

APIopenpyxl已经发生了足够的变化(请参阅https://openpyxl.readthedocs.io/en/stable/usage.html),我已经通过 @Boud (现在是 @Zeugma?)更新了这部分答案,如下所示:

\n
import openpyxl\nimport csv\n\nwb = openpyxl.load_workbook(\'test.xlsx\')\nsh = wb.active # was .get_active_sheet()\nwith open(\'test.csv\', \'w\', newline="") as file_handle:\n    csv_writer = csv.writer(file_handle)\n    for row in sh.iter_rows(): #\xc2\xa0generator; was sh.rows\n        csv_writer.writerow([cell.value for cell in row])\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n
csv_writer = csv.writer(fout, delimiter=\'|\', quotechar=\'"\', quoting=csv.QUOTE_MINIMAL)\n
Run Code Online (Sandbox Code Playgroud)\n

华泰

\n

  • 这里有几个错别字。“with”末尾需要“as f”,“sh.iter_rows”应该是“sh.iter_rows()”,否则效果很好,谢谢! (2认同)

Fab*_*enP 13

使用pandas会更短一些:

import pandas as pd

df = pd.read_excel('my_file', sheetname='my_sheet_name')  # sheetname is optional
df.to_csv('output_file_name', index=False)  # index=False prevents pandas to write row index

# oneliner
pd.read_excel('my_file', sheetname='my_sheet_name').to_csv('output_file_name', index=False)
Run Code Online (Sandbox Code Playgroud)

  • 我不相信熊猫会这样做。它一直在转换我所有的前导零。 (2认同)
  • 这个实现非常适合我的场景,只需将“sheetname”更改为“sheet_name”,因为这是一个拼写错误。 (2认同)

Cha*_*ffy 5

使用xlrdopenpyxl模块分别读取xls或xlsx文档,并使用csv模块进行写入。

或者,如果使用Jython,则可以使用Apache POI库读取.xls.xlsx,并且本机CSV模块仍然可用。

  • 如果需要读取.xlsx文件,请使用[openpyxl](http://packages.python.org/openpyxl/)。 (2认同)