将多个csv文件合并到一个xls工作簿Python 3中

时间:2017-02-07 14:23:29

标签: excel python-2.7 python-3.x csv xls

我们正处于从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。

2 个答案:

答案 0 :(得分:5)

不确定为什么会出错。值得努力重写代码并使用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存储在dict中。然后使用新工作表名称将每个df写入Excel。

答案 1 :(得分:0)

您可以使用下面的代码将多个 .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")
相关问题