【问题标题】:Parsing data from csv file to Google Spreadsheet with python使用python将数据从csv文件解析到Google电子表格
【发布时间】:2017-01-24 14:35:45
【问题描述】:

我正在编写一个 python 脚本来将数据从 csv 文件发送到 Google 电子表格。我对这个项目的基本需求有一个清晰的了解,但是我完全迷失了从 csv 文件到谷歌表的格式化/解析数据(我还在学习 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 格式之间。

【问题讨论】:

    标签: python arrays json csv


    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      相关资源
      最近更新 更多