【问题标题】:How can I specify the delimiter that gspread uses when running the function import_csv to separate the fields?如何指定 gspread 在运行 import_csv 函数以分隔字段时使用的分隔符?
【发布时间】:2021-03-17 15:48:47
【问题描述】:

我正在编写一个使用 | 作为分隔符的 .csv 文件。我希望能够在运行函数import_csv() 时指定这一点。我怎样才能做到这一点?为此,我必须使用 gspread 替代方案吗? Tbh 我只需要一个代码示例。

【问题讨论】:

    标签: python-3.x google-sheets google-sheets-api gspread


    【解决方案1】:

    我相信你的目标如下。

    • 您想使用 gspread 将 CSV 数据放入 Google 电子表格。
    • 您想通过提供分隔符(如|)来放置 CSV 数据。
    • 您已经能够使用 Sheets API 获取和放置 Google 电子表格的值。

    问题和解决方法:

    当我看到 gspread 的脚本时,似乎import_csv(file_id, data) 使用 Drive API 放置了 CSV 数据。 Ref使用Drive API时,当前阶段无法手动设置分隔符。

    因此,在此答案中,作为一种解决方法,我想建议使用 Sheets API 中的 batchUpdate 方法来实现您的目标。示例脚本如下。

    示例脚本:

    spreadsheetId = "###" # Please set the Spreadsheet ID.
    sheetName = "Sheet1" # Please set the sheet name you want to put the CSV data.
    delimiter = "|" # Please set the delimiter.
    csv = open('filename.csv', 'r').read() # Please set the CSV data.
    
    client = gspread.authorize(credentials)
    spreadsheet = client.open_by_key(spreadsheetId)
    sheet = spreadsheet.worksheet(sheetName)
    body = {
        "requests": [
            {
                "pasteData": {
                    "data": csv,
                    "delimiter": delimiter,
                    "coordinate": {
                        "sheetId": sheet.id
                    }
                }
            }
        ]
    }
    spreadsheet.batch_update(body)
    
    • 此脚本将 CSV 数据放入 Sheet1 中的 spreadsheetId
    • 在这个脚本中,关于client,请把它用于你实际使用gspread的脚本。

    参考资料:

    补充:

    根据您的以下回复,

    执行此操作时,它会抛出错误:TypeError: Object of type bytes is not JSON serializable 用于变量 body

    我担心csv = open('filename.csv', 'r').read() 的值可能是由于您当前问题的原因。所以,我想再添加一个示例脚本。在此示例脚本中,脚本中直接使用了 CSV 数据。

    示例脚本:

    spreadsheetId = "###" # Please set the Spreadsheet ID.
    sheetName = "Sheet1" # Please set the sheet name you want to put the CSV data.
    delimiter = "|" # Please set the delimiter.
    
    csv = """a1|b1|c1|d1|e1
    a2|b2|c2||e2
    a3|b3||d3|e3
    """
    
    client = gspread.authorize(credentials)
    spreadsheet = client.open_by_key(spreadsheetId)
    sheet = spreadsheet.worksheet(sheetName)
    body = {
        "requests": [
            {
                "pasteData": {
                    "data": csv,
                    "delimiter": delimiter,
                    "coordinate": {
                        "sheetId": sheet.id
                    }
                }
            }
        ]
    }
    spreadsheet.batch_update(body)
    
    • 在此示例脚本中,csv 的值作为| 的分隔符放入电子表格中。

    【讨论】:

    • 在实现这个时它会抛出错误:TypeError: Object of type bytes is not JSON serializable for the variable body
    • @Watch With Veer 感谢您的回复。我带来的不便表示歉意。不幸的是,我无法复制您的情况。因为当我测试一个示例 CSV 文件时,没有发生错误。我为此道歉。现在,我又添加了一个示例脚本。在添加的示例脚本中,脚本中直接使用了 CSV 数据。因为我担心csv = open('filename.csv', 'r').read() 的值可能是由于您当前问题的原因。但我不确定您的实际 CSV 文件。我为此道歉。请测试添加的脚本,确认脚本是否再次生效。
    • 好的,谢谢。问题是,我正在对 csv 文件进行编码,就像 csv = open ('filename.csv, 'r').read().encode('utf-8').
    • @Watch With Veer 感谢您的回复。我不得不为我糟糕的英语水平道歉。很遗憾,从您的回复和目前的情况来看,我无法理解您的问题是否已经解决。我可以问你这个吗?
    • @Watch With Veer 感谢您的快速回复。很高兴您的问题得到解决。
    猜你喜欢
    • 2012-02-19
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    相关资源
    最近更新 更多