อ่านไฟล์ซิปเป็น DataFrame แพนด้า


109

ฉันกำลังพยายามคลายซิปไฟล์ csv และส่งไปยังแพนด้าเพื่อที่ฉันจะได้ทำงานกับไฟล์นั้น
รหัสที่ฉันได้ลองแล้วคือ:

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 จะสามารถรับไฟล์ได้ แต่ฉันได้รับข้อความ "ไม่มีอยู่จริง" ในตอนท้ายของข้อผิดพลาด

ใครช่วยบอกทีว่าฉันทำอะไรไม่ถูกต้อง?

คำตอบ:


163

หากคุณต้องการอ่านไฟล์ซิปหรือไฟล์ tar.gz ลงในดาต้าเฟรมของแพนด้าread_csvวิธีการดังกล่าวรวมถึงการนำไปใช้งานนี้โดยเฉพาะ

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

หรือแบบยาว:

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

คำอธิบายของอาร์กิวเมนต์การบีบอัดจากเอกสาร :

การบีบอัด : {'infer', 'gzip', 'bz2', 'zip', 'xz', None}, ค่าเริ่มต้น 'infer' สำหรับการคลายการบีบอัดข้อมูลบนดิสก์แบบ on-the-fly หาก 'infer' และ filepath_or_buffer เป็นเหมือนพา ธ ให้ตรวจจับการบีบอัดจากส่วนขยายต่อไปนี้: '.gz', '.bz2', '.zip' หรือ '.xz' (มิฉะนั้นจะไม่มีการคลายการบีบอัด) หากใช้ "zip" ไฟล์ ZIP จะต้องมีไฟล์ข้อมูลเพียงไฟล์เดียวที่จะอ่านได้ตั้งค่าเป็นไม่มีเพื่อไม่ให้มีการบีบอัด

ใหม่ในเวอร์ชัน 0.18.1: รองรับการบีบอัด 'zip' และ 'xz'


6
ไม่รองรับไฟล์ซิปมีเพียง gzip และ bz2 นี่เป็นเรื่องที่น่ารำคาญเพราะซิปเป็นเรื่องธรรมดา ฉันคิดว่าเป็นเพราะ zip ไม่ใช่โอเพ่นซอร์ส?
TC Proctor

24
zip ได้รับการสนับสนุนในแพนด้าแล้ว 0.18.1
nishant

1
โซลูชันนี้ใช้ได้กับไฟล์ gzipped แต่ไม่ใช่สำหรับไฟล์. tar.gz (Pandas 0.19.2) Pandas ไม่รองรับ Tar.gz! ดู: github.com/pandas-dev/pandas/issues/…
tector

คุณช่วยบอกเราได้ไหมว่ามีเหตุผลใดที่ต้องใช้quotechar?
Herpes Free Engineer

คำตอบนี้แสดง.tar.gzไฟล์ แต่อาจใช้ได้กับ.gzไฟล์เท่านั้น
William Entriken

41

ฉันคิดว่าคุณต้องการ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)

3
หมายเหตุ: คุณสามารถแยกวิเคราะห์คอลัมน์วันที่เมื่ออ่าน:pd.read_csv(z.open('crime_incidents_2013_CSV.csv'), parse_dates=['REPORTDATETIME', 'LASTMODIFIEDDATE'])
Andy Hayden

หากต้องการอ่านไฟล์แรก:pd.read_csv(z.open(z.infolist()[0].filename))
user3226167

15

ดูเหมือนว่าคุณไม่จำเป็นต้องระบุการบีบอัดอีกต่อไป ตัวอย่างข้อมูลต่อไปนี้โหลดข้อมูลจาก filename.zip ลงใน df

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

(แน่นอนคุณจะต้องระบุตัวคั่นส่วนหัว ฯลฯ หากแตกต่างจากค่าเริ่มต้น)


นี่ควรเป็นคำตอบอันดับต้น ๆ แต่คนอื่น ๆ ก็ล้าสมัย
rjurney

12

สำหรับไฟล์ " 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...

0

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! แม้ว่ารหัสนี้อาจตอบคำถามได้ แต่การให้บริบทเพิ่มเติมไม่ว่าจะเป็นความคิดเห็นเกี่ยวกับโค้ดหรือเป็นย่อหน้าแยกต่างหากเกี่ยวกับวิธีการและ / หรือสาเหตุที่แก้ปัญหาได้จะช่วยเพิ่มมูลค่าในระยะยาวของคำตอบ
Sardar Usama
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.