這似乎是一項簡單的任務,但它已經讓我好幾個星期了。這很簡單。我的本地驅動器上有一個 CSV 檔案。我想將行附加到現有的 Google 表格中(已經有我需要保留的行)這是代碼:
import pandas as pd
import os.path
from googleapiclient import discovery
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from oauth2client.service_account import ServiceAccountCredentials
import gspread as gs
scope = ["https://spreadsheets.google.com/feeds", 'https://www.googleapis.com/auth/spreadsheets',
"https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive"]
# Set variables
imp_dir = "C:\\Users\\SRevelle\\Google Drive"
credentials = ServiceAccountCredentials.from_json_keyfile_name('C:\\Users\\SRevelle\\Google Drive\\client_secret.json', scope)
client = gs.authorize(credentials)
service = discovery.build('sheets', 'v4', credentials=credentials)
#Go get the file to load
os.chdir(imp_dir)
csvData = 'data.csv'
#Load it into dataframe
df = pd.read_csv(csvData)
# The ID of the spreadsheet to update.
spreadsheet_id = '1_XXXXXXXXXXXdwEOkETjEI0HrdP5M5Jh4XXXXXXXXXX'
# Values will be appended after the last row of the table.
rangeval = 'Test!A1:H1'
# How the input data should be interpreted.
value_input_option = 'USER_ENTERED'
# How the input data should be inserted.
insert_data_option = 'INSERT_ROWS'
request = service.spreadsheets().values().append(spreadsheetId=spreadsheet_id, range=rangeval, valueInputOption=value_input_option, insertDataOption=insert_data_option, body={'data':df})
response = request.execute()
這是來自 csv 檔案的資料框結果:
Type Number Date Number Description1 Description2 CAD$ USD$
0 Visa 1211 2/9/2021 0 MISC PAYMENT RBC CREDIT CARD -20.88 0
1 MC 123 2/9/2021 0 testtest xyz card 101.11 0
我嘗試了許多不同的事情,并經歷了許多不同的錯誤。有時我使用 .to_json 只是為了看看會給我帶來什么錯誤。
我用這段代碼得到的錯誤是:
TypeError Traceback (most recent call last)
Untitled-2 in <module>
34
35 insert_data_option = 'INSERT_ROWS'
---> 36 request = service.spreadsheets().values().append(spreadsheetId=spreadsheet_id, range=rangeval, valueInputOption=value_input_option, insertDataOption=insert_data_option, body={'data':df})
37 response = request.execute()
~\Miniconda3\lib\site-packages\googleapiclient\discovery.py in method(self, **kwargs)
1092
1093 headers = {}
-> 1094 headers, params, query, body = model.request(
1095 headers, actual_path_params, actual_query_params, body_value
1096 )
~\Miniconda3\lib\site-packages\googleapiclient\model.py in request(self, headers, path_params, query_params, body_value)
158 if body_value is not None:
159 headers["content-type"] = self.content_type
--> 160 body_value = self.serialize(body_value)
161 self._log_request(headers, path_params, query, body_value)
162 return (headers, path_params, query, body_value)
~\Miniconda3\lib\site-packages\googleapiclient\model.py in serialize(self, body_value)
271 ):
272 body_value = {"data": body_value}
--> 273 return json.dumps(body_value)
274
275 def deserialize(self, content):
我看到很多人試圖這樣做,但解決方案是下載一些自定義應用程式,迭代地回圈檔案或通過 GUI 匯入它。一定有更簡單的方法!!任何幫助將不勝感激。
uj5u.com熱心網友回復:
在你的情況下,下面的修改如何?
改裝要點:
- 不幸的是,在 Sheets API 中,不能直接使用資料框。蒂姆·羅伯茨( Tim Roberts) 的評論中已經提到了這一點。
- 的屬性
data不存在于spreadsheets.values.append方法中。當您想使用電子表格.values.append 附加值時,請使用values.
當這些點反映在你的腳本中時,它變成如下。
修改后的腳本:
從:
request = service.spreadsheets().values().append(spreadsheetId=spreadsheet_id, range=rangeval, valueInputOption=value_input_option, insertDataOption=insert_data_option, body={'data':df})
response = request.execute()
到:
values = df.values.tolist()
request = service.spreadsheets().values().append(spreadsheetId=spreadsheet_id, range=rangeval, valueInputOption=value_input_option, insertDataOption=insert_data_option, body={'values': values})
response = request.execute()
如果要添加header,請修改如下。
values = [df.columns.values.tolist()]
values.extend(df.values.tolist())
request = service.spreadsheets().values().append(spreadsheetId=spreadsheet_id, range=rangeval, valueInputOption=value_input_option, insertDataOption=insert_data_option, body={'values': values})
response = request.execute()
參考:
- 方法:spreadsheets.values.append
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/365581.html
標籤:Python 熊猫 谷歌表格 google-sheets-api
上一篇:將多列中的字串拆分為行
