programing

문자열에 쓰기Panda Excelwriter를 사용한 IO 객체

linuxpc 2023. 4. 11. 21:45
반응형

문자열에 쓰기Panda Excelwriter를 사용한 IO 객체

스트링을 전달할 수 있습니다.pd.to_csv()에 대한 IO 오브젝트는 정상입니다.

io = StringIO.StringIO()
pd.DataFrame().to_csv(io)

하지만 엑셀 라이터를 사용할 때는 더 많은 어려움을 겪고 있습니다.

io = StringIO.StringIO()
writer = pd.ExcelWriter(io)
pd.DataFrame().to_excel(writer,"sheet name")
writer.save()   

를 반환한다.

AttributeError: StringIO instance has no attribute 'rfind'

저는 지금 이 프로그램을 만들고 있는ExcelWriter호출하지 않고 이의를 제기하다pd.ExcelWriter()문제가 좀 있어요지금까지 제가 시도한 것은 다음과 같습니다.

from xlsxwriter.workbook import Workbook
writer = Workbook(io)
pd.DataFrame().to_excel(writer,"sheet name")
writer.save()

근데 지금 내가 받는 건AttributeError: 'Workbook' object has no attribute 'write_cells'

팬더 데이터 프레임을 Excel 형식으로 저장하려면 어떻게 해야 합니까?StringIO오브젝트?

팬더스는 각 라이터 엔진이 지원하지만 ExcelWriter 생성자에 대한 파일 이름 경로를 기대합니다.StringIO아마도 그것은 판다의 버그/기능 요청으로 제기되어야 할 것이다.

한편, 여기 판다를 사용한 회피책의 예가 있습니다.xlsxwriter엔진:

import pandas as pd
import StringIO

io = StringIO.StringIO()

# Use a temp filename to keep pandas happy.
writer = pd.ExcelWriter('temp.xlsx', engine='xlsxwriter')

# Set the filename/file handle in the xlsxwriter.workbook object.
writer.book.filename = io

# Write the data frame to the StringIO object.
pd.DataFrame().to_excel(writer, sheet_name='Sheet1')
writer.save()
xlsx_data = io.getvalue()

업데이트: Panda 0.17부터는 보다 직접적으로 이 작업을 수행할 수 있게 되었습니다.

# Note, Python 2 example. For Python 3 use: output = io.BytesIO().
output = StringIO.StringIO()

# Use the StringIO object as the filehandle.
writer = pd.ExcelWriter(output, engine='xlsxwriter')

XlsxWriter 문서의 문자열에 데이터 프레임 출력 저장을 참조하십시오.

이 중 어느 것도 내게는 효과가 없었다.장고에서 엑셀 워크북을 반납하고 싶은 풍경이 있었습니다.팬더 문서를 보고 해결책을 찾았어요

import io
bio = io.BytesIO()
writer = pd.ExcelWriter(bio, engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1')
writer.save()
bio.seek(0)

# BONUS CONTENT
# .. because I wanted to return from an api
response = HttpResponse(bio, content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
response['Content-Disposition'] = 'attachment; filename=myfile.xlsx'
return response # returned from a view here

mozilla 문서에 따르면 이 값은 mime 유형이었기 때문에 컨텐츠 유형에 사용되었습니다.다음 링크의 ".xlsx"에서.필요에 따라서 교환해 주세요.https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types

xlwt를 라이터로 사용하는 것을 꺼려하지 않는다면 pandas.io.http://pandas.io.http://http://http://http://http:/http://http:/http다른 엔진도 그렇게 어렵지 않을 수 있지만 xlwt는 저장 방식이 스트림 또는 파일 경로를 사용하기 때문에 쉽게 튀어나옵니다.

처음에는 팬더를 즐겁게 하기 위해 파일 이름을 전달해야 합니다. 팬더가 지원되는 포맷인지 확인하기 위해 파일 확장자를 엔진에 대조합니다.그러나 xlwt 엔진의 경우 파일 이름을 객체의 경로 속성에 입력하고 저장 메서드에 사용합니다.경로 속성을 스트림으로 변경하면 저장 메서드를 호출할 때 해당 스트림에 저장됩니다.

다음은 예를 제시하겠습니다.

import pandas as pd
import StringIO
import base64

df = pd.DataFrame.from_csv('http://moz.com/top500/domains/csv')
xlwt_writer = pd.io.excel.get_writer('xlwt')
my_writer = xlwt_writer('whatever.xls')  #make pandas happy 
xl_out = StringIO.StringIO()
my_writer.path = xl_out  
df.to_excel(my_writer)
my_writer.save()
print base64.b64encode(xl_out.getvalue())

이것이 빠르고 쉽고 약간 더러운 방법입니다.BTW... 보다 깔끔한 방법은 ExcelWriter(또는 기존 서브클래스 중 하나)를 서브클래스로 하는 것입니다.솔직히 경로 속성을 갱신하는 일은 거의 없기 때문에 조금 더 긴 경로를 가는 것보다 쉬운 방법을 보여드리고 싶습니다.

하지 않는 xlsxwriter의 들 their로서engine=★★★★★★에to_excel여기 사용할 수 있는 솔루션이 있습니다.openpyxl★★★★★★★★★★★★★★★★★★:

in_memory_file = StringIO.StringIO()
xlw = pd.ExcelWriter('temp.xlsx', engine='openpyxl')
# ... do many .to_excel() thingies
xlw.book.save(in_memory_file)
# if you want to read it or stream to a client, don't forget this
in_memory_file.seek(0)

<고객명>님:ExcelWriter는 엔진 을 「」에 공개합니다..book★★★★★★★의 경우openpyxl 후, 「」를 할 수 .Workbook.save소!로!

언급URL : https://stackoverflow.com/questions/28058563/write-to-stringio-object-using-pandas-excelwriter

반응형