【问题标题】:How to save an Excel worksheet as CSV如何将 Excel 工作表另存为 CSV
【发布时间】:2012-06-03 20:52:15
【问题描述】:

我想编写一个 Python 脚本来读取 Excel 电子表格并将其中的一些工作表保存为 CSV 文件。

我该怎么做?

我找到了third-party modules 用于从 Python 读取和写入 Excel 文件,但据我所知,它们只能以 Excel(即 *.xls)格式保存文件。如果我在这里错了,将不胜感激一些示例代码,说明如何使用这些模块执行我正在尝试执行的操作。

我还遇到了one solution,我不太明白,但它似乎是特定于 Windows 的,因此无论如何都帮不了我,因为我想在 Unix 中执行此操作。无论如何,我不清楚这个解决方案是否可以扩展为我想做的事情,即使在 Windows 下也是如此。

【问题讨论】:

    标签: python excel csv


    【解决方案1】:

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

    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])
    

    【讨论】:

    • openpyxl评估Excel公式:wb = openpyxl.load_workbook('test.xlsx', data_only=True)
    • @Zeugma 如何将此 csv 写回文件夹? (在我的情况下 aws s3)我不断收到 AttributeError: '_io.TextIOWrapper' object has no attribute 'save'
    【解决方案2】:

    使用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)
    

    【讨论】:

    • 我不相信 pandas 会这样做。它一直在转换我所有的前导零。
    • 你能提供更多细节吗?
    • 这个实现非常适合我的场景,只需将sheetname 更改为sheet_name,因为这是一个错字。
    • @rrs 为什么不使用 pd.read_excel('my_file', dtype=str) ?更多信息here
    【解决方案3】:

    截至 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 制作了一些有用的 cmets - 特别是:

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

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

    HTH

    【讨论】:

    • 这里有几个错别字。 "with" 结尾需要 "as f",而 "sh.iter_rows" 应该是 "sh.iter_rows()" 否则,效果很好,谢谢!
    • @eakst7 非常感谢 - 你能相信我打出来的吗 - 现在已修复 - 很高兴它有帮助。
    • 谢谢,这很有用。我的两个 cmets: 1. pylama 不喜欢单字母变量名称,并且对 csv.writer 的调用提供了额外的选项(例如自定义分隔符),这些选项很酷。例如:csv_writer = csv.writer(fout, delimiter='|', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    • @Leonid 非常感谢 - 根据您的帮助更新!
    【解决方案4】:

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

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

    【讨论】:

    • 如果您需要阅读 .xlsx 文件,请使用 openpyxl
    • 我更喜欢 xlsxrd 阅读 .xlsx 文件。在某个时候,它会被合并到xlrd
    【解决方案5】:

    首先将您的 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')  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      • 2020-11-23
      • 2017-09-22
      • 2012-03-16
      • 2019-08-06
      • 2013-11-07
      • 1970-01-01
      相关资源
      最近更新 更多