如何在不使用 pandas 的情况下将 Google sheet 导出为 Python 中的 CSV?

How do I export a Google sheet as a CSV in Python without using pandas?

我正在使用 Python 3.9 和以下版本的 Google Sheets ...

gsheets==0.5.1
gspread==3.6.0

我正在尝试将我的 Google sheet 导出为 CSV 文件。在 Python 的旧版本中,我像这样使用 Pandas 模块

    import gspread
    ...
    client = gspread.authorize(creds)
    sheet = client.open('My_Sheet_name')

    # get the third sheet of the Spreadsheet.  This
    # contains the data we want
    sheet_instance = sheet.get_worksheet(3)

    records_data = sheet_instance.get_all_records()

    records_df = pd.DataFrame.from_dict(records_data)

    # view the top records
    records_df.to_csv(sys.stdout)  

如何在不使用 Pandas 的情况下导出 CSV?我问是因为 Python 的较新版本(例如 3.9)似乎还不支持 pandas 模块。

您可以使用 csv 模块中的 DictWriter 将每个字典作为单独的行添加到 csv 结果中:

import sys
from csv import DictWriter

dict_writer = DictWriter(sys.stdout, records_data[0].keys())
dict_writer.writeheader()
for data in records_data:
    dict_writer.writerow(data)

如果您想将 csv 写入文件而不是 stdout,可以改用此代码段:

from csv import DictWriter

with open('./path/to/the/file', 'w') as csvfile:
    dict_writer = DictWriter(csvfile, records_data[0].keys())
    dict_writer.writeheader()
    for data in records_data:
        dict_writer.writerow(data)

示例:

records_data 包含以下值:[{'a': 1, 'b': 2}, {'a': 2, 'b': 3}, {'a': 3, 'b': 4}]

然后 header 取自列表任意元素的键(在本例中是第一个元素):ab.

然后将值逐行添加到 csv:

a, b
1, 2
2, 3
3, 4

我认为您的目标如下。

  • 您想检索 Google Spreadsheet 中的 sheet 之一作为 CSV 数据。
  • 您想在不使用 Pandas 的情况下使用 gspread 实现此目的。
  • 您已经可以使用gspread了。

在这种情况下,为了实现您的目标,我想建议使用端点将 sheet 导出为 CSV 数据。从 client = gspread.authorize(creds)client 检索访问令牌。当这个提议反映到你的脚本中,就变成了这样。

修改后的脚本:

client = gspread.authorize(creds)
sheet = client.open('My_Sheet_name')

# get the third sheet of the Spreadsheet.  This
# contains the data we want
sheet_instance = sheet.get_worksheet(2)  # Modified

# I added below script.
url = 'https://docs.google.com/spreadsheets/d/' + sheet.id + '/gviz/tq?tqx=out:csv&gid=' + str(sheet_instance.id)
headers = {'Authorization': 'Bearer ' + client.auth.token}
res = requests.get(url, headers=headers)
print(res.text)
  • 在上面的脚本中,请添加import requests
  • 当上面的脚本是 运行 时,第 3 个 sheet 被导出为 CSV 数据。

注:

  • 关于 sheet_instance = sheet.get_worksheet(3),您的评论说 get the third sheet of the Spreadsheet.。但是 get_worksheet 的第一个数字是 0。因此,在这种情况下,将检索 Spreadsheet 中的第 4 个 sheet。请注意这一点。

  • 在这种情况下,我认为您也可以使用如下端点。

      url = 'https://docs.google.com/spreadsheets/d/' + sheet.id + '/export?format=csv&gid=' + str(sheet_instance.id)