我正在开发一个Python 2.7
脚本,用于分析SQL表中的数据,最后生成一个CSV文件。
生成文件后,我正在登录我的Google工作表帐户,并使用导入选项将我的CSV文件导入到Google电子表格中
手工劳动有点愚蠢,我希望将这种能力添加到我的剧本中。
所以,我按照本指南Python Quickstart完成了所有步骤。
然后我跟着Google Sheets API reference并查看了Method: spreadsheets.create。如果我理解正确,它不提供从文件导入的选项。
似乎没有导入功能的API。
如何使用Google表格API V4导入CSV文件?他们是我缺少的一个例子/参考吗?
答案 0 :(得分:10)
您有两种导入g CSV文件的选项。您可以使用Drive API从CSV创建电子表格,也可以使用表单API将create空电子表格用于spreadsheets.batchUpdate,然后使用PasteDataRequest添加{{3}}来添加CSV数据。
答案 1 :(得分:4)
我喜欢Burnash的gspread库,但是他的答案中的import_csv
功能有限。它总是从第一个工作表(标签)的A1
开始粘贴,并删除所有其他标签。
我需要从特定的选项卡和单元格开始粘贴,因此我接受了Sam Berlin的建议使用PasteDataRequest。这是我的功能:
def pasteCsv(csvFile, sheet, cell):
'''
csvFile - path to csv file to upload
sheet - a gspread.Spreadsheet object
cell - string giving starting cell, optionally including sheet/tab name
ex: 'A1', 'MySheet!C3', etc.
'''
if '!' in cell:
(tabName, cell) = cell.split('!')
wks = sheet.worksheet(tabName)
else:
wks = sheet.sheet1
(firstRow, firstColumn) = gspread.utils.a1_to_rowcol(cell)
with open(csvFile, 'r') as f:
csvContents = f.read()
body = {
'requests': [{
'pasteData': {
"coordinate": {
"sheetId": wks.id,
"rowIndex": firstRow-1,
"columnIndex": firstColumn-1,
},
"data": csvContents,
"type": 'PASTE_NORMAL',
"delimiter": ',',
}
}]
}
return sheet.batch_update(body)
请注意,我使用原始的pasteData请求而不是更高级别的update_cells
方法来利用Google对包含引号的字符串(可能包含非定界逗号)的输入数据的自动(正确)处理。 / p>
答案 2 :(得分:2)
我已经花了几个小时试图使其他答案起作用。库无法很好地说明身份验证,也无法与Google提供的处理凭据的方式一起使用。 另一方面,Sam的答案并未详细说明使用API的细节,这有时可能会造成混淆。 因此,这是将CSV上传到gSheets的完整方法。它同时使用了Sam和CapoChino的答案以及我自己的一些研究。
credentials.json
无需任何额外步骤quickstart.py
可以轻松地改编为authenticate.py
https://www.googleapis.com/auth/spreadsheets
希望现在您已经存储了凭据,所以让我们转到实际的代码
import pickle
from googleapiclient.discovery import build
SPREADSHEET_ID = '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms' # Get this one from the link in browser
worksheet_name = 'Sheet2'
path_to_csv = 'New Folder/much_data.csv'
path_to_credentials = 'Credentials/token.pickle'
# convenience routines
def find_sheet_id_by_name(sheet_name):
# ugly, but works
sheets_with_properties = API \
.spreadsheets() \
.get(spreadsheetId=SPREADSHEET_ID, fields='sheets.properties') \
.execute() \
.get('sheets')
for sheet in sheets_with_properties:
if 'title' in sheet['properties'].keys():
if sheet['properties']['title'] == sheet_name:
return sheet['properties']['sheetId']
def push_csv_to_gsheet(csv_path, sheet_id):
with open(csv_path, 'r') as csv_file:
csvContents = csv_file.read()
body = {
'requests': [{
'pasteData': {
"coordinate": {
"sheetId": sheet_id,
"rowIndex": "0", # adapt this if you need different positioning
"columnIndex": "0", # adapt this if you need different positioning
},
"data": csvContents,
"type": 'PASTE_NORMAL',
"delimiter": ',',
}
}]
}
request = API.spreadsheets().batchUpdate(spreadsheetId=SPREADSHEET_ID, body=body)
response = request.execute()
return response
# upload
with open(path_to_credentials, 'rb') as token:
credentials = pickle.load(token)
API = build('sheets', 'v4', credentials=credentials)
push_csv_to_gsheet(
csv_path=path_to_csv,
sheet_id=find_sheet_id_by_name(worksheet_name)
)
直接使用batchUpdate
的好处是,它每秒可以上传数千行。在较低级别,gspread
会执行相同的操作,因此应与性能相同。也有gspread-pandas。
p.s。该代码已使用python 3.5
测试,但该线程似乎最适合提交给该线程。
答案 3 :(得分:0)
作为Sam Berlin的答案的替代方案,您可以将CSV转换为列表列表并将其设置为POST有效负载。
这样的功能看起来像这样:
<input type="radio" id="rad1" name="rad" value="choice 1">
<label for="rad1">Choice 1</label>
<input type="radio" id="rad2" name="rad" value="choice 2">
<label for="rad2">Choice 2</label>
<input type="radio" id="rad3" name="rad" value="choice 3">
<label for="rad3">Choice 3</label>
<p><button id="getChecked">Get the checked radio button value</button></p>
主数组被抛入以下内容:
def preprocess(table):
table.to_csv('pivoted.csv') # I use Pandas but use whatever you'd like
_file = open('pivoted.csv')
contents = _file.read()
array = contents.split('\n')
master_array = []
for row in array:
master_array.append(row.split(','))
return master_array
它适用于我。
答案 4 :(得分:0)
山姆·柏林的答案的另一种选择。如果您使用的是Python,则可以通过gspread使用Drive API导入CSV文件。这是一个示例:
import gspread
# Check how to get `credentials`:
# https://github.com/burnash/gspread
gc = gspread.authorize(credentials)
# Read CSV file contents
content = open('file_to_import.csv', 'r').read()
gc.import_csv('<SPREADSHEET_ID>', content)