67

我将一个文件上传到 Google 电子表格(以制作一个可公开访问的示例 IPython Notebook,其中包含数据)我正在使用它的本机形式的文件可以读入 Pandas 数据框。所以现在我使用下面的代码来读取电子表格,工作正常,但只是作为字符串出现,而且我没有任何运气试图将它恢复到数据框中(你可以获取数据)

import requests
r = requests.get('https://docs.google.com/spreadsheet/ccc?key=0Ak1ecr7i0wotdGJmTURJRnZLYlV3M2daNTRubTdwTXc&output=csv')
data = r.content

数据最终看起来像:(第一行标题)

',City,region,Res_Comm,mkt_type,Quradate,National_exp,Alabama_exp,Sales_exp,Inventory_exp,Price_exp,Credit_exp\n0,Dothan,South_Central-Montgomery-Auburn-Wiregrass-Dothan,Residential,Rural,1/15/2010,2,2,3,2,3,3\n10,Foley,South_Mobile-Baldwin,Residential,Suburban_Urban,1/15/2010,4,4,4,4,4,3\n12,Birmingham,North_Central-Birmingham-Tuscaloosa-Anniston,Commercial,Suburban_Urban,1/15/2010,2,2,3,2,2,3\n

引入磁盘驻留文件的原生 pandas 代码如下所示:

df = pd.io.parsers.read_csv('/home/tom/Dropbox/Projects/annonallanswerswithmaster1012013.csv',index_col=0,parse_dates=['Quradate'])

一个“干净”的解决方案将有助于许多人提供一种简单的方法来共享数据集供 Pandas 使用!我尝试了一堆没有成功的替代方案,我很确定我又错过了一些明显的东西。

只是一个更新说明新的 Google 电子表格有一个不同的 URL 模式只需使用它来代替上面示例中的 URL 和/或下面的答案,你应该没问题这是一个示例:

https://docs.google.com/spreadsheets/d/177_dFZ0i-duGxLiyg6tnwNDKruAYE-_Dd8vAQziipJQ/export?format=csv&id

请参阅下面来自 @Max Ghenis 的解决方案,它只使用了 pd.read_csv,不需要 StringIO 或请求......

4

9 回答 9

70

似乎没有StringIO

test = pd.read_csv('https://docs.google.com/spreadsheets/d/' + 
                   '0Ak1ecr7i0wotdGJmTURJRnZLYlV3M2daNTRubTdwTXc' +
                   '/export?gid=0&format=csv',
                   # Set first column as rownames in data frame
                   index_col=0,
                   # Parse column values to datetime
                   parse_dates=['Quradate']
                  )
test.head(5)  # Same result as @TomAugspurger

顺便说一句,包括?gid=启用导入不同的工作表,在 URL 中找到 gid。

于 2016-02-06T20:23:08.223 回答
61

您可以read_csv()StringIO对象上使用:

from io import BytesIO

import requests
import pandas as pd

r = requests.get('https://docs.google.com/spreadsheet/ccc?key=0Ak1ecr7i0wotdGJmTURJRnZLYlV3M2daNTRubTdwTXc&output=csv')
data = r.content
    
In [10]: df = pd.read_csv(BytesIO(data), index_col=0,parse_dates=['Quradate'])

In [11]: df.head()
Out[11]: 
          City                                            region     Res_Comm  \
0       Dothan  South_Central-Montgomery-Auburn-Wiregrass-Dothan  Residential   
10       Foley                              South_Mobile-Baldwin  Residential   
12  Birmingham      North_Central-Birmingham-Tuscaloosa-Anniston   Commercial   
38       Brent      North_Central-Birmingham-Tuscaloosa-Anniston  Residential   
44      Athens                 North_Huntsville-Decatur-Florence  Residential   

          mkt_type            Quradate  National_exp  Alabama_exp  Sales_exp  \
0            Rural 2010-01-15 00:00:00             2            2          3   
10  Suburban_Urban 2010-01-15 00:00:00             4            4          4   
12  Suburban_Urban 2010-01-15 00:00:00             2            2          3   
38           Rural 2010-01-15 00:00:00             3            3          3   
44  Suburban_Urban 2010-01-15 00:00:00             4            5          4   

    Inventory_exp  Price_exp  Credit_exp  
0               2          3           3  
10              4          4           3  
12              2          2           3  
38              3          3           2  
44              4          4           4  
于 2013-10-26T21:02:16.660 回答
19

在浏览器中打开您想要的特定工作表。确保至少有链接的任何人都可以看到它。复制并粘贴 URL。你会得到类似的东西https://docs.google.com/spreadsheets/d/BLAHBLAHBLAH/edit#gid=NUMBER

sheet_url = 'https://docs.google.com/spreadsheets/d/BLAHBLAHBLAH/edit#gid=NUMBER'

首先,我们将其转换为 CSV 导出 URL,例如https://docs.google.com/spreadsheets/d/BLAHBLAHBLAH/export?format=csv&gid=NUMBER

csv_export_url = sheet_url.replace('/edit#gid=', '/export?format=csv&gid=')

然后我们将它传递给pd.read_csv,它可以接受一个 URL。

df = pd.read_csv(csv_export_url)

如果 Google 更改其 API(似乎没有记录),这将中断,并且如果发生网络故障,可能会给出无用的错误。

于 2018-05-16T17:48:50.230 回答
10

我的方法有点不同。我只是使用了 pandas.Dataframe() 但显然需要安装和导入 gspread。而且效果很好!

gsheet = gs.open("Name")
Sheet_name ="today"
wsheet = gsheet.worksheet(Sheet_name)
dataframe = pd.DataFrame(wsheet.get_all_records())
于 2018-01-02T14:37:53.477 回答
7

我一直在使用以下实用程序,到目前为止它一直有效:

def load_from_gspreadsheet(sheet_name, key):
    url = 'https://docs.google.com/spreadsheets/d/{key}/gviz/tq?tqx=out:csv&sheet={sheet_name}&headers=1'.format(
        key=key, sheet_name=sheet_name.replace(' ', '%20'))

    log.info('Loading google spreadsheet from {}'.format(url))

    df = pd.read_csv(url)
    return df.drop([col for col in df.columns if col.startswith('Unnamed')], axis=1)

您必须指定 sheet_name 和密钥。关键是您从以下路径中的 url 获得的字符串:https://docs.google.com/spreadsheets/d/{key}/edit/.

如果列名不止一行,您可以更改标题的值,但我不确定它是否仍然适用于多标题。

如果谷歌改变他们的 API,它可能会刹车。

另外请记住,您的电子表格必须是公开的,知道链接的每个人都可以阅读。

于 2018-02-26T10:40:56.330 回答
3

如果 csv 文件是通过驱动器而不是通过电子表格共享的,那么下面对 url 的更改将起作用

#Derive the id from the google drive shareable link.
#For the file at hand the link is as below
#<https://drive.google.com/open?id=1-tjNjMP6w0RUV4GhJWw08ql3wYwsNU69>
file_id='1-tjNjMP6w0RUV4GhJWw08ql3wYwsNU69'
link='https://drive.google.com/uc?export=download&id={FILE_ID}'
csv_url=link.format(FILE_ID=file_id)
#The final url would be as below:-
#csv_url='https://drive.google.com/uc?export=download&id=1-tjNjMP6w0RUV4GhJWw08ql3wYwsNU69'
df = pd.read_csv(csv_url)

数据框将是(如果您只是运行上面的代码)

    a   b   c   d
0   0   1   2   3
1   4   5   6   7
2   8   9   10  11
3   12  13  14  15

请参阅此处的工作代码。

于 2018-05-08T01:34:00.553 回答
2

在 Google 表格文件中,转到文件 > 发布到网络 > 选择 .csv(见屏幕截图)> 复制链接

Google 表格:发布到网络

代码

import pandas as pd

path = 'https://docs.google.com/spreadsheets/d/e/2PACX-1vSvmELTzIjfSmX8GuV3HE2qomN3uRyvPX8RDzpw77JH33DUbj1bjech7H6NYPArvpZFux0DdJ5L5TKy/pub?output=csv'
data = pd.read_csv(path)
print(data)

Google Colab 中的代码

于 2021-08-13T09:28:59.703 回答
2

第一的

import pandas as pd
pd.read_csv("https://docs.google.com/spreadsheets/d/e/{}/pub?gid=0&single=true&output=csv")
于 2021-12-02T03:08:27.140 回答
0

这对我有用。

import pandas as pd

#Create a public URL
#https://docs.google.com/spreadsheets/d/0Ak1ecr7i0wotdGJmTURJRnZLYlV3M2daNTRubTdwTXc/edit?usp=sharing

#get spreadsheets key from url
gsheetkey = "0Ak1ecr7i0wotdGJmTURJRnZLYlV3M2daNTRubTdwTXc"

#sheet name
sheet_name = 'Sheet 1'

url=f'https://docs.google.com/spreadsheet/ccc?key={gsheetkey}&output=xlsx'
df = pd.read_excel(url,sheet_name=sheet_name)
print(df)
于 2021-02-11T08:43:17.410 回答