/ / Download dei file in base a se esistono già e se esiste una cartella per loro Python - python, download, percorso, cartella, file-esiste

Download di file in base a se esistono già e se esiste una cartella per loro Python - python, download, percorso, cartella, file-esiste

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 № 1

Per 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!