【问题标题】:Read a zipped file as a pandas DataFrame将压缩文件读取为 pandas DataFrame
【发布时间】:2013-09-23 23:26:40
【问题描述】:

我正在尝试解压缩一个 csv 文件并将其传递给 pandas,以便我可以处理该文件。
到目前为止我尝试过的代码是:

import requests, zipfile, StringIO
r = requests.get('http://data.octo.dc.gov/feeds/crime_incidents/archive/crime_incidents_2013_CSV.zip')
z = zipfile.ZipFile(StringIO.StringIO(r.content))
crime2013 = pandas.read_csv(z.read('crime_incidents_2013_CSV.csv'))

在最后一行之后,虽然python能够获取文件,但我在错误的末尾得到一个“不存在”。

谁能告诉我我做错了什么?

【问题讨论】:

    标签: python zip pandas


    【解决方案1】:

    如果您想将压缩文件或 tar.gz 文件读入 pandas 数据帧,read_csv 方法包含此特定实现。

    df = pd.read_csv('filename.zip')
    

    或长格式:

    df = pd.read_csv('filename.zip', compression='zip', header=0, sep=',', quotechar='"')
    

    docs 中压缩参数的描述:

    压缩 : {‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None},默认‘infer’ 用于磁盘数据的即时解压缩。如果“infer”和 filepath_or_buffer 类似于路径,则从以下扩展名检测压缩:“.gz”、“.bz2”、“.zip”或“.xz”(否则不解压缩)。如果使用“zip”,则 ZIP 文件必须只包含一个要读取的数据文件。设置为 None 不解压缩。

    0.18.1 版中的新功能:支持“zip”和“xz”压缩。

    【讨论】:

    • 不支持压缩文件,只支持 gzip 和 bz2。这很烦人,因为 zip 很常见。我想这是因为 zip 不是开源的?
    • pandas 0.18.1 现已支持 zip
    • 此解决方案适用于 gzip 压缩文件,但不适用于 .tar.gz 文件 (Pandas 0.19.2) Pandas 不支持 Tar.gz!见:github.com/pandas-dev/pandas/issues/…
    • 能否告诉我们是否有任何特殊原因使用quotechar
    • 这个答案显示了一个.tar.gz 文件,但它可能只适用于.gz 文件。
    【解决方案2】:

    我想你想open ZipFile,它返回一个类似文件的对象,而不是read

    In [11]: crime2013 = pd.read_csv(z.open('crime_incidents_2013_CSV.csv'))
    
    In [12]: crime2013
    Out[12]:
    <class 'pandas.core.frame.DataFrame'>
    Int64Index: 24567 entries, 0 to 24566
    Data columns (total 15 columns):
    CCN                            24567  non-null values
    REPORTDATETIME                 24567  non-null values
    SHIFT                          24567  non-null values
    OFFENSE                        24567  non-null values
    METHOD                         24567  non-null values
    LASTMODIFIEDDATE               24567  non-null values
    BLOCKSITEADDRESS               24567  non-null values
    BLOCKXCOORD                    24567  non-null values
    BLOCKYCOORD                    24567  non-null values
    WARD                           24563  non-null values
    ANC                            24567  non-null values
    DISTRICT                       24567  non-null values
    PSA                            24567  non-null values
    NEIGHBORHOODCLUSTER            24263  non-null values
    BUSINESSIMPROVEMENTDISTRICT    3613  non-null values
    dtypes: float64(4), int64(1), object(10)
    

    【讨论】:

    • 注:阅读时可以解析日期列:pd.read_csv(z.open('crime_incidents_2013_CSV.csv'), parse_dates=['REPORTDATETIME', 'LASTMODIFIEDDATE'])
    • 读取第一个文件:pd.read_csv(z.open(z.infolist()[0].filename))
    【解决方案3】:

    看来您甚至不必再指定压缩方式了。下面的 sn -p 将 filename.zip 中的数据加载到 df 中。

    import pandas as pd
    df = pd.read_csv('filename.zip')
    

    (当然,如果分隔符、标题等与默认值不同,则需要指定它们。)

    【讨论】:

    • 这应该是最佳答案,其他都过时了。
    【解决方案4】:

    对于“zip”文件,您可以使用import zipfile,您的代码只需使用这些行即可:

    import zipfile
    import pandas as pd
    with zipfile.ZipFile("Crime_Incidents_in_2013.zip") as z:
       with z.open("Crime_Incidents_in_2013.csv") as f:
          train = pd.read_csv(f, header=0, delimiter="\t")
          print(train.head())    # print the first 5 rows
    

    结果将是:

    X,Y,CCN,REPORT_DAT,SHIFT,METHOD,OFFENSE,BLOCK,XBLOCK,YBLOCK,WARD,ANC,DISTRICT,PSA,NEIGHBORHOOD_CLUSTER,BLOCK_GROUP,CENSUS_TRACT,VOTING_PRECINCT,XCOORD,YCOORD,LATITUDE,LONGITUDE,BID,START_DATE,END_DATE,OBJECTID
    0  -77.054968548763071,38.899775938598317,0925135...                                                                                                                                                               
    1  -76.967309569035052,38.872119553647011,1003352...                                                                                                                                                               
    2  -76.996184958456539,38.927921847721443,1101010...                                                                                                                                                               
    3  -76.943077541353617,38.883686046653935,1104551...                                                                                                                                                               
    4  -76.939209158039446,38.892278093281632,1125028...
    

    【讨论】:

    • 如果您的 zipfile 中有多个文件,这是必需的。至少,这是我能够开始工作的。
    【解决方案5】:

    我猜你下面的样子是什么

    from io import BytesIO
    import requests
    import pandas as pd
    
    result = requests.get("https://www.xxx.zzz/file.zip")
    df = pd.read_csv(BytesIO(result.content),compression='zip', header=0, sep=',', quotechar='"')
    

    阅读这些文章以了解原因:https://medium.com/dev-bits/ultimate-guide-for-working-with-i-o-streams-and-zip-archives-in-python-3-6f3cf96dca50

    【讨论】:

      【解决方案6】:

      https://www.kaggle.com/jboysen/quick-gz-pandas-tutorial

      请点击此链接。

      import pandas as pd
      traffic_station_df = pd.read_csv('C:\\Folders\\Jupiter_Feed.txt.gz', compression='gzip',
                                       header=1, sep='\t', quotechar='"')
      
      #traffic_station_df['Address'] = 'address'
      
      #traffic_station_df.append(traffic_station_df)
      print(traffic_station_df)
      

      【讨论】:

      • 欢迎来到 Stack Overflow!虽然这段代码可能会回答这个问题,但提供额外的上下文作为代码的 cmets 或作为关于它如何和/或为什么解决问题的单独段落将提高答案的长期价值。
      猜你喜欢
      • 2021-05-30
      • 2016-08-18
      • 1970-01-01
      • 2017-02-16
      • 2013-11-16
      • 1970-01-01
      • 2021-04-05
      • 2019-03-28
      • 1970-01-01
      相关资源
      最近更新 更多