【问题标题】:Getting Google Spreadsheet CSV into A Pandas Dataframe将 Google 电子表格 CSV 导入 Pandas 数据框
【发布时间】:2013-11-05 20:43:46
【问题描述】:

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

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 或请求...

【问题讨论】:

  • 您是如何从驱动器中获取csv 链接的?
  • 只需在浏览器中打开电子表格并复制网址
  • URL 以/edit?ts=5c0e311e#gid=0 结尾,分享链接以/edit?usp=sharing 结尾,没有csv 并且在熊猫代码请求时都给出404
  • 在文档菜单上使用 csv 格式下载

标签: python pandas google-sheets google-drive-api google-apps


【解决方案1】:

如果没有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。

【讨论】:

  • 好点你也在用P3吗?没有机会重新检查也很好不需要请求...
  • 是的,我正在使用 Python 3。
  • 很好的解决方案,刚刚验证过,好多了!
  • 也许只添加 cmets 关于 index_col 和 parse_dates 的作用?另外,也许这很明显,但我认为这只有在电子表格是公开的情况下才有效;我相信如果不是,您将不得不使用 API。
  • 很好的解决方案。当工作表共享为“Internet 上具有此链接的任何人都可以查看”时工作。请注意,index_colparse_dates 参数是可选的。
【解决方案2】:

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

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  

【讨论】:

  • 我一直在寻找如何将电子表格导入 pandas 的方法。从未听说过请求或 StringIO 库。谢谢!!
  • 请注意上面原始问题底部的新 URL 格式,新的 Google 电子表格版本需要它
  • 澄清“如果你正在使用它,在 python3 中移动”:from io import StringIO
  • 谢谢!但我不得不使用这种形式的 google url 来输出 csv:stackoverflow.com/a/23702001/507544
  • 如何指定工作表(即 URL 中的 #gid=x)?在key= 之后将其添加到 URL 本身不起作用。
【解决方案3】:

在浏览器中打开您想要的特定工作表。确保至少有链接的任何人都可以看到它。复制并粘贴 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(似乎没有记录),这将中断,并且如果发生网络故障,可能会给出无用的错误。

【讨论】:

  • 此代码返回一个用于下载 csv 的 HTML 页面,而不是来自 gsheet 的 csv 文件。
  • 我收到 ParserError:错误标记数据。 C 错误:第 6 行中应有 1 个字段,看到 2
【解决方案4】:

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

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

【讨论】:

  • 不错..界面越来越干净!
  • 澄清一下,gs 将是 gs = gspread.authorize(credentials)
【解决方案5】:

我一直在使用以下实用程序,到目前为止它工作正常:

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/

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

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

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

【讨论】:

    【解决方案6】:

    如果 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

    【讨论】:

      【解决方案7】:

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

      Google Sheets: Publish to web

      代码

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

      Code in Google Colab

      【讨论】:

        【解决方案8】:

        这对我有用。

        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)
        

        【讨论】:

          【解决方案9】:

          第一

          import pandas as pd
          pd.read_csv("https://docs.google.com/spreadsheets/d/e/{}/pub?gid=0&single=true&output=csv")
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-02-23
            • 2014-07-31
            • 2015-11-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-06-25
            相关资源
            最近更新 更多