2016-07-01 21 views
0

zu öffnen Ich muss --- in einem einzigen Rahmen --- jede produkt_monat_Monatswerte_18910101_20110331_00003.txt Datei in jeder der Zip-Dateien von this ftp verketten Seite? ˅.Pandas: Ich versuche, eine spezifische TXT-Datei in einer ZIP-Datei auf einer FTP-Site

Dies ist der Code, den ich bisher bin mit:

import pandas as pd 
    from pandas.io.parsers import * 
    import glob 
    import requests 
    from zipfile import ZipFile 
    import urllib.request as ur 


    years = 'produkt_monat_Monatswerte_*.txt' 

names = pd.DataFrame() 
for year in years: 
    path ="ftp://ftp-cdc.dwd.de/pub/CDC/observations_germany/climate/monthly/kl/historical/monatswerte_?????_????????_????????_hist.zip").read() 
    frame = pd.read_csv(path, names=columns) 

    frame['year'] = year 
    names = names.concat(frame, ignore_index=True) 

und es gibt mir die folgende Fehlermeldung:

File "<ipython-input-25-d57a1d77ecc6>", line 5 
    path ="ftp://ftp-cdc.dwd.de/pub/CDC/observations_germany/climate/monthly/kl/historical/monatswerte_?????_????????_????????_hist.zip") 
+1

Ihre erste Frage ist die 'glob' Bit es die Datei nicht öffnen können, müssen Sie zunächst diesen Schritt lösen, bevor Pandas sogar um es zu öffnen versuchen kann – EdChum

Antwort

1

Das Problem ist, Sie haben nicht Pandas eine innere extrahieren Datei aus dem Zip. Versuchen Sie, den folgenden Code:

import pandas as pd 
from ftplib import FTP 
import os 
from zipfile import ZipFile 
from io import BytesIO 

f_root = 'ftp-cdc.dwd.de' 
zips_path = '/pub/CDC/observations_germany/climate/monthly/kl/historical/' 

ftp = FTP(f_root) 

ftp.login() 

ftp.cwd(zips_path) 

paths = [p[0] for p in ftp.mlsd('.') if p[0].endswith('.zip')] 

dfs = [] 

for path in paths: 
    buf = BytesIO() 
    ftp.retrbinary("RETR " + path, lambda block: buf.write(block)) 
    z = ZipFile(buf) 

    zi = list(filter(lambda x: x.filename.startswith('produkt'), z.filelist))[0] 
    df = pd.read_csv(BytesIO(z.read(zi.filename)), sep=';', encoding="cp1252") 
    dfs.append(df) 

final = pd.concat(dfs) 
+0

Vielen Dank für Ihre Antwort . Wie kann ich eine Schleife verketten über alle von ihnen –

+1

'dfs = [] für Pfad in Pfade erstellen: buf = BytesIO() ftp.retrbinary ("RETR" + Pfad, Lambda-Block: buf.write (Block)) z = ZipFile (buf) zi = Liste (Filter (Lambda x: Dateiname.startswith ('Produkt'), z.filelist)) [0] df = pd.read_csv (BytesIO (z. lesen (zi.filename)), sep = ';', encoding = "cp1252") dfs.append (df) final = pd.concat (dfs) '(Kommentar ist ein bisschen durcheinander, iv'e einfach eine Schleife hinzugefügt.) – OmerBA

+0

Danke! :) Denkst du, dass du deine Antwort mit diesem^Kommentar aktualisieren kannst? –