获取谷歌电子表格CSV到一个数据帧熊猫

问题描述 投票:45回答:6

我上传文件到谷歌电子表格(做一个公开访问的例子IPython的笔记本,采用数据)我所用的文件,在它的原始形式,可以读入数据帧大熊猫。所以,现在我使用下面的代码读取电子表格,工作正常,但刚进来的字符串,,和我没有任何运气试图让它回到一个数据帧(你可以得到的数据)

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

数据最终看起来像:(1排头)

',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

在磁盘驻留文件所带来的本地大熊猫代码如下所示:

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

“干净”的解决方案将有助于许多人提供了一种简单的方式来分享对大熊猫使用的数据集!我尝试了一堆替代,但没有成功,我敢肯定,我又失去了一些东西明显。

只是一个更新注意新的谷歌电子表格都有不同的URL模式在上面的例子中和或低于答案只需使用这个来代替URL的,你应该罚款这里是一个例子:

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

看到@Max Ghenis刚刚使用pd.read_csv,不需要StringIO的或请求以下解决方案...

python pandas google-sheets google-drive-sdk google-apps
6个回答
50
投票

您可以在read_csv()对象使用StringIO

from io import BytesIO

import requests
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  

52
投票

似乎为我工作,没有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

BTW,包括?gid=使导入了不同的表,发现在URL中的GID。


9
投票

打开你的浏览器所需的特定表。确保它通过该链接的人至少观看。复制并粘贴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)

这将打破,如果谷歌改变其API(似乎没有证件),如果发生网络故障可能会给无益的错误。


8
投票

我的做法是有点不同。我只是用pandas.Dataframe(),但显然需要安装和进口gspread。它工作得很好!

gsheet = gs.open("Name")
Sheet_name ="today"
wsheet = gsheet.worksheet(Sheet_name)
dataframe = pd.DataFrame(wsheet.get_all_records())

3
投票

我一直用以下utils的,它到目前为止的工作:

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)

您必须指定的工作表名和密钥。关键是你从以下路径中的网址,以获取字符串:https://docs.google.com/spreadsheets/d/{key}/edit/

您可以更改标题的值,如果您对列名多行,但我不知道这是否仍具有多接口兼容。

它可以制动,如果谷歌将改变他们的API。

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


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

见工作代码here

© www.soinside.com 2019 - 2024. All rights reserved.