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

Combine multiple csv files into a single xls workbook 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.

中 运行ning 时会抛出错误
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 代替。

不确定为什么会出错。重写代码并改用 pandas 是值得的。 Pandas 可以将每个 csv 文件读取到单独的数据帧中,并将所有数据帧作为单独的 sheet 保存在 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 存储在字典中。然后用新的sheet名称将每个df写入Excel。

Multi-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 导入的错误。)

您可以使用下面的代码,将多个 .csv 文件读入一个大的 .xlsx Excel 文件。 我还添加了将 ',' 替换为 '.' 的代码(反之亦然),以根据您的区域设置提高 windows 环境下的兼容性。

import pandas as pd
import sys
import os
import glob
from pathlib import Path

extension = 'csv'
all_filenames = [i for i in glob.glob('*.{}'.format(extension))]

writer = pd.ExcelWriter('fc15.xlsx') # Arbitrary output name
for csvfilename in all_filenames:

    txt = Path(csvfilename).read_text()
    txt = txt.replace(',', '.')

    text_file = open(csvfilename, "w")
    text_file.write(txt)
    text_file.close()
    
    print("Loading "+ csvfilename)
    df= pd.read_csv(csvfilename,sep=';', encoding='utf-8')

    df.to_excel(writer,sheet_name=os.path.splitext(csvfilename)[0])
    print("done")
writer.save()
print("task completed")