/ / Pobieranie plików na podstawie, jeśli już istnieją i jeśli istnieje dla nich folder Python - python, pobieranie, ścieżka, folder, plik-istnieje

Pobieranie plików na podstawie, czy już istnieją i czy istnieje dla nich folder Python - python, download, ścieżka, folder, plik - istnieje

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

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