Sto cercando di creare uno script che scaricafile da un sito FTP in base al fatto che disponga di una cartella in cui inserirli (in base al codice di data) e se ho già scaricato il file e averlo in quella cartella. Credo di avere i pezzi per farlo comunque, non sono sicuro di come combinarli per farli funzionare.
Finora per scaricare i file dal server FTP ho il seguente codice.
from ftplib import FTP
import os, sys, os.path
import re
def handleDownload(block):
file.write(block)
ddir="U:/Test Folder"
os.chdir(ddir)
ftp = FTP("sidads.colorado.edu")
ftp.login()
print ("Logging in.")
directory = "/pub/DATASETS/NOAA/G02158/unmasked/2012/04_Apr/"
print ("Changing to " + directory)
ftp.cwd(directory)
ftp.retrlines("LIST")
print ("Accessing files")
filenames = ftp.nlst() # get filenames within the directory
print (filenames)
for filename in filenames:
if filename not in [".", ".."]:
local_filename = os.path.join(ddir, filename)
print(filename)
with open(local_filename, "wb") as f_output:
ftp.retrbinary("RETR "+ filename, f_output.write)
ftp.quit()
Per tirare i valori di stringa che ho bisogno dalnomi di file e utilizzare questi valori stringa per determinare se esiste o meno la cartella in cui vengono inseriti e se il file esiste o meno ho utilizzato il seguente codice. (Una nota importante è che i valori delle stringhe estratti dai nomi dei file che ho scaricato corrispondono ai codici che ho usato nei miei percorsi di file, permettendomi quindi di abbinarli)
for fname in filenames:
tl = fname[16:20]
t2 = fname[20:22]
t3 = fname[22:24]
if not tl: continue
print (tl) # You can append the result to a list
print (t2) # You can append the result to a list
print (t3) # You can append the result to a list
if os.path.exists(os.path.join("U:/SWEModelConstruction/UnmaskedData/",t1,t2,t3)) == true and os.path.isfile("U:/SWEModelConstruction/UnmaskedData/",t1,t2,t3,filename) != true
risposte:
0 per risposta № 1Per seguire il tuo metodo,
def check_path(fname):
tl = fname[16:20]
t2 = fname[20:22]
t3 = fname[22:24]
if not tl: continue
if os.path.exists(os.path.join(dirr,t1,t2,t3)) == true and os.path.isfile(dirr,t1,t2,t3,filename) != true
for filename in filenames:
if filename not in [".", ".."]:
check_path(filename)
local_filename = os.path.join(ddir, filename)
print(filename)
with open(local_filename, "wb") as f_output:
ftp.retrbinary("RETR "+ filename, f_output.write)
Fondamentalmente è necessario verificare che il percorso sia disponibile, altrimenti non creare directory.
E poi, se il file è presente usando os.path.isfile()
e ciò può essere fatto in un modo più semplice, come (per rendere le cose più generalizzate)
def check_path(path):
if not os.path.exists(path):
return False
return True
for filename in filenames:
if filename not in [".", ".."]:
local_filename = os.path.join(ddir, filename)
path="/".join(local_filename.split("/")[:-1])
# check if dir exists otherwise create one
# wrtie files that doesnt exists
if os.path.exists(path) and not os.path.isfile(filename):
with open(local_filename, "wb") as f_output:
ftp.retrbinary("RETR "+ filename, f_output.write)
Spero che sia d'aiuto!