Đọc tệp nén dưới dạng DataFrame của gấu trúc


108

Tôi đang cố giải nén tệp csv và chuyển nó vào gấu trúc để tôi có thể làm việc trên tệp.
Mã tôi đã thử cho đến nay là:

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

Sau dòng cuối cùng, mặc dù python có thể lấy tệp, tôi nhận được "không tồn tại" ở cuối lỗi.

Ai đó có thể cho tôi biết những gì tôi đang làm không chính xác?

Câu trả lời:


159

Nếu bạn muốn đọc một tệp đã nén hoặc một tệp tar.gz vào khung dữ liệu gấu trúc, các read_csvphương pháp bao gồm triển khai cụ thể này.

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

Hoặc dạng dài:

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

Mô tả đối số nén từ tài liệu :

nén : {'Suy ra', 'gzip', 'bz2', 'zip', 'xz', Không có}, mặc định 'suy luận' Để giải nén dữ liệu trên đĩa nhanh chóng. Nếu 'suy luận' và filepath_or_buffer giống như đường dẫn, thì hãy phát hiện nén từ các phần mở rộng sau: '.gz', '.bz2', '.zip' hoặc '.xz' (nếu không thì không giải nén). Nếu sử dụng 'zip', tệp ZIP chỉ được chứa một tệp dữ liệu để đọc. Đặt thành Không để không giải nén.

Tính năng mới trong phiên bản 0.18.1: hỗ trợ nén 'zip' và 'xz'.


6
Không có hỗ trợ cho các tệp nén, chỉ có gzip và bz2. Điều này gây khó chịu, bởi vì zip khá phổ biến. Tôi tưởng tượng điều này là do zip không phải là mã nguồn mở?
Giám đốc TC

24
zip hiện đang được hỗ trợ trong gấu trúc 0.18.1
Nishant

1
Giải pháp này hoạt động với tệp được gzipped nhưng không hoạt động với tệp .tar.gz (Pandas 0.19.2) Tar.gz không được Pandas hỗ trợ! Xem: github.com/pandas-dev/pandas/issues/…
tector

Bạn có thể vui lòng cho chúng tôi biết liệu có lý do cụ thể nào để sử dụng quotecharkhông?
Herpes Free Engineer,

Câu trả lời này hiển thị một .tar.gztệp, nhưng nó có thể chỉ hoạt động với một .gztệp.
William Entriken

41

Tôi nghĩ bạn muốn openZipFile, nó trả về một đối tượng giống tệp, thay vì 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)

3
Lưu ý: bạn có thể phân tích các cột ngày khi đọc:pd.read_csv(z.open('crime_incidents_2013_CSV.csv'), parse_dates=['REPORTDATETIME', 'LASTMODIFIEDDATE'])
Andy Hayden

Để đọc các tập tin đầu tiên:pd.read_csv(z.open(z.infolist()[0].filename))
user3226167

15

Có vẻ như bạn thậm chí không cần phải chỉ định nén nữa. Đoạn mã sau tải dữ liệu từ filename.zip vào df.

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

(Tất nhiên bạn sẽ cần chỉ định dấu phân tách, tiêu đề, v.v. nếu chúng khác với giá trị mặc định.)


Đây phải là câu trả lời hàng đầu, những câu khác đã lỗi thời.
rjurney

12

Đối với các tệp " zip ", bạn có thể sử dụng import zipfilevà mã của bạn sẽ hoạt động đơn giản với các dòng sau:

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

Và kết quả sẽ là:

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...

0

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

Vui lòng theo liên kết này.

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)

Chào mừng bạn đến với Stack Overflow! Mặc dù mã này có thể trả lời câu hỏi, nhưng việc cung cấp ngữ cảnh bổ sung dưới dạng nhận xét với mã hoặc dưới dạng một đoạn văn riêng về cách thức và / hoặc lý do tại sao nó giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
Sardar Usama
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.