/ / Herunterladen von Dateien basierend darauf, ob sie bereits vorhanden sind und wenn es einen Ordner für sie gibt: Python - Python, Download, Pfad, Ordner, Datei

Herunterladen von Dateien basierend auf, wenn sie bereits existieren und wenn es einen Ordner für sie gibt Python - Python, Download, Pfad, Ordner, Datei existiert

Ich versuche ein Skript zu erstellen, das heruntergeladen wirdDateien von einer FTP-Site basierend darauf, ob ich einen Ordner zum Einfügen habe (basierend auf dem Datumscode) und ob ich die Datei bereits heruntergeladen habe und nicht in diesem Ordner habe. Ich glaube, ich habe die Stücke dafür, aber ich bin nicht sicher, wie ich sie kombinieren kann, um sie zur Arbeit zu bringen.

Um die Dateien vom FTP-Server herunterzuladen, habe ich den folgenden Code.

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()

Um die Stringwerte zu ziehen, muss ich aus demDateinamen und zur Verwendung dieser Zeichenfolgenwerte, um zu bestimmen, ob der Ordner, in den sie eingefügt werden sollen, vorhanden ist und ob die Datei vorhanden ist oder nicht. Ich habe den folgenden Code verwendet. (Ein wichtiger Hinweis ist, dass die Zeichenfolgenwerte, die aus den Dateinamen, die ich herunterlade, abgerufen wurden, den Codes entsprechen, die in meinen Dateipfaden verwendet wurden.

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

Antworten:

0 für die Antwort № 1

Um Ihrer Methode zu folgen,

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)

Sie müssen grundsätzlich überprüfen, ob der Pfad verfügbar ist, wenn Sie keine Verzeichnisse erstellen.

Und dann, wenn die Datei vorhanden ist os.path.isfile() und das kann auf einfachere Weise erfolgen, als (um die Dinge allgemeiner zu machen)

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)

Ich hoffe es hilft!