簡體   English   中英

將多個 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 中運行時會拋出錯誤。

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 文件讀入一個單獨的數據幀,並將所有數據幀作為一個單獨的工作表保存在一個 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導入的錯誤。)

您可以使用下面的代碼,將多個.csv 文件讀取到一個 big.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")

這是對已接受答案的輕微擴展。 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 個字符。

如果你的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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM