IT

여러 CSV 파일을 단일 xls 워크북 Python 3에 결합

itgroup 2023. 6. 7. 22:31
반응형

여러 CSV 파일을 단일 xls 워크북 Python 3에 결합

우리는 직장에서 python 2.7에서 python 3.5로 전환 중입니다.이는 전사적인 변화이며 현재 대부분의 스크립트는 2.7로 작성되었으며 추가 라이브러리는 없습니다.저는 우리가 사용하고 있는 아나콘다 디스트리뷰터를 이용했고 이미 대부분의 스크립트를 2-3 모듈을 사용하거나 완전히 다시 작성하는 것으로 변경했습니다.하지만 저는 제가 작성하지 않았고 원래 작성자가 없는 코드 한 개에 갇혀 있습니다.그는 또한 코멘트를 제공하지 않아서 나는 전체 대본을 추측할 수 있을 뿐입니다.스크립트의 95%는 구문 분석된 정보가 서로 다른 7개의 csv 파일을 생성한 후 csv 파일을 통합하고 각 csv를 새 탭으로 하여 xls 워크북에 결합하는 사용자 지정 기능이 있는 마지막까지 올바르게 작동합니다.

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를 만드는 완전히 새로운 방법을 생각하고 있습니다. 아마도 판다를 대신할 수도 있습니다.

그것이 왜 잘못되었는지 잘 모르겠습니다.코드를 다시 쓰고 대신 판다를 사용하는 것은 가치 있는 일입니다.Panda는 각 csv 파일을 별도의 데이터 프레임으로 읽고 모든 데이터 프레임을 별도의 시트로 xls(x) 파일에 저장할 수 있습니다.이것은 팬더의 Excel Writer를 사용하여 할 수 있습니다.예.

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 파일을 하나의 큰 .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")

여기 수락된 답변에 대한 약간의 확장이 있습니다.판다 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")

언급URL : https://stackoverflow.com/questions/42092263/combine-multiple-csv-files-into-a-single-xls-workbook-python-3

반응형