Próbuję utworzyć skrypt do pobraniapliki z witryny FTP na podstawie tego, czy mam folder do ich umieszczenia (na podstawie kodu daty) i czy już pobrałem plik i czy mam go w tym folderze. Wierzę jednak, że mam do zrobienia, ale nie jestem pewien, jak je połączyć, aby mogły działać.
Do tej pory, aby pobrać pliki z serwera FTP, mam następujący kod.
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()
Aby pobrać wartości ciągu, których potrzebuję odnazwy plików i użycie tych wartości łańcuchowych do określenia, czy folder do ich umieszczenia istnieje i czy plik istnieje, czy nie, użyłem następującego kodu. (Ważna uwaga jest taka, że wartości ciągów pobranych z nazw plików, które pobieram, pasują do kodów, których użyłem w ścieżkach do moich plików, dzięki czemu mogę je dopasować)
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
Odpowiedzi:
0 dla odpowiedzi № 1Aby zastosować swoją metodę,
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)
Zasadniczo musisz sprawdzić, czy ścieżka jest dostępna, jeśli nie, utwórz katalogi.
A następnie, jeśli plik jest obecny przy użyciu os.path.isfile()
i można to zrobić w prostszy sposób, aby (aby rzeczy były bardziej uogólnione)
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)
Mam nadzieję, że to pomoże!