将多个 csv 文件组合成一个 xls 工作簿 Python 3

新手上路,请多包涵

我们正在从 python 2.7 过渡到 python 3.5。这是公司范围内的变化,我们当前的大部分脚本都是用 2.7 编写的,没有其他库。我利用了我们正在使用的 Anaconda 发行版,并且已经更改了我们的大部分脚本,而不是使用 2to3 模块或完全重写它们。不过,我被困在一段代码上,这不是我写的,原作者也不在这里。他也没有提供评论,所以我只能猜测整个剧本。 95% 的脚本正确工作直到结束,在它创建 7 个具有不同解析信息的 csv 文件之后,它具有自定义功能,可以将 csv 文件组合到 xls 工作簿中,每个 csv 作为新选项卡。

 import csv
import xlwt
import glob
import openpyxl
from openpyxl import Workbook

Parsefiles = glob.glob(directory + '/' + "Parsed*.csv")
def xlsmaker():
    for f in Parsefiles:
        (path, name) = os.path.split(f)
        (chort_name, extension) = os.path.splittext(name)
        ws = wb.add_sheet(short_name)
        xreader = csv.reader(open(f, 'rb'))
        newdata = [line for line in xreader]
        for rowx, row in enumerate(newdata)
            for colx, value in enumerate(row):
                if value.isdigit():
            ws.write(rowx, colx, value)

xlsmaker()

for f in Parsefiles:
    os.remove(f)

wb.save(directory + '/' + "Finished" + '' + oshort + '' + timestr + ".xls")

这是全部用 python 2.7 编写的,如果我在 python 2.7 中运行它仍然可以正常工作。问题是它在 python 3.5 中运行时会抛出错误。

 File "parsetool.py", line 521, in (module)
  xlsmaker()
File "parsetool.py", line 511, in xlsmaker
  ws = wb.add_sheet(short_name)
File "c:\pythonscripts\workbook.py", line 168 in add_sheet
  raise TypeError("The paramete you have given is not of the type '%s'"% self._worksheet_class.__name__)
TypeError: The parameter you have given is not of the type "Worksheet"

关于应该如何解决上述错误的任何想法?我试过多次重写,但我遇到了类似的错误或新的错误。我正在考虑只是想出一个全新的方法来创建 xls,可能是 pandas。

原文由 Tobias Wright 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 670
2 个回答

不知道为什么会出错。重写代码并改用 pandas 是值得的。 Pandas 可以将每个 csv 文件读入一个单独的数据帧,并将所有数据帧作为一个单独的工作表保存在一个 xls(x) 文件中。这可以通过使用 pandas 的 ExcelWriter 来完成。例如

import pandas as pd
writer = pd.ExcelWriter('yourfile.xlsx', engine='xlsxwriter')
df = pd.read_csv('originalfile.csv')
df.to_excel(writer, sheet_name='sheetname')
writer.save()

由于您有多个 csv 文件,您可能希望读取所有 csv 文件并将它们作为 df 存储在字典中。然后用新的工作表名称将每个 df 写入 Excel。

多 csv 示例:

 import pandas as pd
import sys
import os

writer = pd.ExcelWriter('default.xlsx') # Arbitrary output name
for csvfilename in sys.argv[1:]:
    df = pd.read_csv(csvfilename)
    df.to_excel(writer,sheet_name=os.path.splitext(csvfilename)[0])
writer.save()

(请注意,可能需要 pip install openpyxl 来解决错误 xlsxwriter import missing。)

原文由 user5550905 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是对已 接受答案 的轻微扩展。 Pandas 1.5 抱怨调用 writer.save() 。解决方法是将编写器用作上下文管理器。

 import sys
from pathlib import Path
import pandas as pd

with pd.ExcelWriter("default.xlsx") as writer:
    for csvfilename in sys.argv[1:]:
        p = Path(csvfilename)
        sheet_name = p.stem[:31]
        df = pd.read_csv(p)
        df.to_excel(writer, sheet_name=sheet_name)

此版本还缩减了工作表名称以适应 Excel 的最大工作表名称长度,即 31 个字符。

原文由 Christian Long 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题