使用python

时间:2017-01-24 14:35:46

标签: python arrays json csv

我正在编写一个python脚本,用于将数据从csv文件发送到Google电子表格。我已经清楚地了解了这个项目的基本需求,但是我完全忘记了从csv文件到google工作表的格式化/解析数据(我还在学习python!)。

所以这是我的代码的第一部分:

def add_todo():

    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    discoveryUrl = ('https://sheets.googleapis.com/$discovery/rest?'
                    'version=v4')
    service = discovery.build('sheets', 'v4', http=http,
                              discoveryServiceUrl=discoveryUrl)

    spreadsheetId = 'spreadsheetidhere'
    rangeName = 'A1:A'
    # https://developers.google.com/sheets/guides/values#appending_values
    values = {'values':[['Hello Saturn',],]}
    result = service.spreadsheets().values().append(
        spreadsheetId=spreadsheetId, range=rangeName,
        valueInputOption='RAW',
        body=values).execute()

if __name__ == '__main__':
    add_todo()

我自己没有写它并且它工作得很好。

以下是我的代码的第二部分:

test = []
with open('data.csv', 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
            test.append(row)

它也正常工作,即使我真的不知道如何将它与我的代码的第一部分混合在一起。我做到了这一点:

test = []

def add_todo():
    with open('snap.csv', 'rb') as f:
        reader = csv.reader(f)
        for row in reader:
                test.append(row)
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    discoveryUrl = ('https://sheets.googleapis.com/$discovery/rest?'
                    'version=v4')
    service = discovery.build('sheets', 'v4', http=http,
                              discoveryServiceUrl=discoveryUrl)

    spreadsheetId = '1UJGs-gJCIUDv5jg5-p0MPEqsokYu5k2MfJ8A5oBkpWs'
    rangeName = 'A1:A'

    # https://developers.google.com/sheets/guides/values#appending_values
    values = {'values':[['Hello Saturn',],]}
    result = service.spreadsheets().values().append(
        spreadsheetId=spreadsheetId, range=rangeName,
        valueInputOption='RAW',
        body=values).execute()

if __name__ == '__main__':
    add_todo()

您可以猜测我的主要问题是如何继续将test数组中的数据传递到电子表格值values = {'values':[['Hello Saturn',],]}

我想做这样的事情:values = {'values':[test]}但显然它不起作用。

总结一下,这是我的csv文件:

data1,data2,data3,data4,...
value1x,value2x,value3x,value4x,...
value1y,value2y,value3y,value4y,...
value1z,value2z,value3z,value4z,...

这就是我在电子表格中想要的内容:

data1   data2   data3   data4 //col name
value1x value2x value3x value4x //row1
value1y value2y value3y value4y //row2
etc...

我在arraylist,json格式之间完全丢失了。

1 个答案:

答案 0 :(得分:1)

您需要在主API调用中指定range参数和body。如果您查看API documentation,您会看到body需要具有以下表单

values = [
    [
        # Cell values ...
    ],
    # Additional rows ...
]
body = {
  'values': values
}

即一个包含一个元素values的字典,它是一个列表列表。包含CSV数据的test变量已经显示为列表列表,因此您可以继续使用。您不必在此担心JSON,因为API的Python界面会自动将您的Python词典和列表转换为JSON。 range参数有点棘手,但根据使用工作表名称的文档,它会将值附加到该工作表的末尾。因此,将上述内容放在一起,您的代码可能看起来像这样(我还没有测试过):

def add_todo():
    test = []  # test should be initialized in the function body
    with open('snap.csv', 'rb') as f:
        reader = csv.reader(f)
        for row in reader:
                test.append(row)
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    discoveryUrl = ('https://sheets.googleapis.com/$discovery/rest?'
                    'version=v4')
    service = discovery.build('sheets', 'v4', http=http,
                              discoveryServiceUrl=discoveryUrl)

    spreadsheetId = '1UJGs-gJCIUDv5jg5-p0MPEqsokYu5k2MfJ8A5oBkpWs'

    # https://developers.google.com/sheets/guides/values#appending_values
    values = {'values': test}
    result = service.spreadsheets().values().append(
        spreadsheetId=spreadsheetId, range=spreadsheetId,
        valueInputOption='RAW',
        body=values).execute()

if __name__ == '__main__':
    add_todo()