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

dluptydi  于 2022-12-06  发布在  Python
关注(0)|答案(4)|浏览(179)

我们正在从python 2.7过渡到python 3.5。这是一个公司范围内的变化,我们目前的大多数脚本都是用2.7编写的,没有额外的库。我已经利用了我们正在使用的Anaconda发行版,并且已经使用2 to 3模块或完全重写了我们的大多数脚本。尽管如此,我还是停留在了一段代码上,这不是我写的,原作者也不在这里。他也没有提供评论,所以我只能猜测整个脚本。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代替。

baubqpgj

baubqpgj1#

不知道为什么会出错。重写代码并使用panda是值得的。panda可以将每个csv文件读入一个单独的 Dataframe ,并将所有 Dataframe 保存为一个单独的xls(x)文件。这可以通过使用panda的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文件并将其存储为dict中的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导入的错误。)*
gr8qqesn

gr8qqesn2#

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

xzlaal3s3#

这里是对accepted answer的一个小小的扩展。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个字符)。

abithluo

abithluo4#

如果您的csv文件是使用gbk编码的中文,则可以使用以下代码

import pandas as pd
import glob
import datetime
from pathlib import Path

now = datetime.datetime.now()

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

with pd.ExcelWriter(f"{now:%Y%m%d}.xlsx") as writer:
    for csvfilename in all_filenames:
        print("Loading " + csvfilename)
        df = pd.read_csv(csvfilename, encoding="gb18030")
        df.to_excel(writer, index=False, sheet_name=Path(csvfilename).stem)
        print("done")
print("task completed")

相关问题