【问题标题】:Upload a Pandas DataFrame as Excel file directly to Google Drive using PyDrive使用 PyDrive 将 Pandas DataFrame 作为 Excel 文件直接上传到 Google Drive
【发布时间】:2017-11-10 17:17:09
【问题描述】:

我正在尝试将pandas.DataFrame 直接写入 Google 云端硬盘,而不是先在本地写出文件。我找不到解决方案,也不确定它是否可能。我试过下面的代码,但我得到了一个AttributeError

import pandas as pd
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

gauth = GoogleAuth()
gauth.LoadCredentialsFile(mycreds)
drive = GoogleDrive(gauth)

df = pd.DataFrame({'a':[1,2],'b':[2,3]})

f = drive.CreateFile({'id': '0B_6_uVX9biFuX0FJWFkt'}) #test.xlsx file
f.SetContentString(df) 
f.Upload()

AttributeError: 'DataFrame' 对象没有属性 'encode'

【问题讨论】:

  • 考虑创建一个临时文件,上传它,然后删除它?
  • 数据框没有原生存储格式。您希望它以什么格式存储?
  • @StephenRauch 我想将它保存为 Excel 文件。并且每天使用 Google Drive 中的文件 ID 专门覆盖现有文件。

标签: python excel pandas openpyxl pydrive


【解决方案1】:

可以让pandas 直接将 Excel 文件写入如下字符串:

代码:

wb = Workbook()
writer = pd.ExcelWriter('', engine='openpyxl')
writer.book = wb
df.to_excel(writer)
file_as_string = save_virtual_workbook(wb)

完整代码:

这是上面的代码与您的示例相结合。请注意,这部分未经测试。

import pandas as pd
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

gauth = GoogleAuth()
gauth.LoadCredentialsFile(mycreds)
drive = GoogleDrive(gauth)

df = pd.DataFrame({'a': [1, 2], 'b': [2, 3]})

from openpyxl.workbook import Workbook
from openpyxl.writer.excel import save_virtual_workbook

wb = Workbook()
writer = pd.ExcelWriter('', engine='openpyxl')
writer.book = wb
df.to_excel(writer)

f = drive.CreateFile({'id': '0B_6_uVX9biFuX0FJWFkt'}) #test.xlsx file
f.SetContentString(save_virtual_workbook(wb))
f.Upload()

【讨论】:

  • 我建议完全避免 ExcelWriter,因为 openpyxl 对 Dataframes openpyxl.readthedocs.io/en/latest/pandas.html 有很好的支持
  • 运行此程序时收到错误消息:UnicodeDecodeError: 'ascii' codec can't decode byte 0xc9 in position 12: ordinal not in range(128)
  • Python 2 还是 3?哪条线路在抱怨?这是示例数据框吗?
  • Python 2.UnicodeDecodeError ... ---> 12 f.SetContentString(save_virtual_workbook(wb))
  • 那是示例数据框吗?另外将SetContentStringsave_virtual_workbook 分开,看看哪个有问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多