ftplib vérifie si un fichier est un dossier?
Comment puis-je vérifier si un fichier sur un ftp distant est un dossier ou non à l'aide de ftplib?
Meilleure façon que j'ai le droit maintenant de faire un nlst, et parcourir l'appel de la taille de chacun des fichiers, si le fichier d'erreur, alors c'est un dossier?
Est-il un meilleur moyen? Je ne peut pas analyser la sortie de la liste, car il ya environ une douzaine de différents serveurs ftp(beaucoup de très vieilles.)
Que dois-je faire?
source d'informationauteur UberJumper
Vous devez vous connecter pour publier un commentaire.
FTP est assez rudimentaire protocole et il n'est pas intégré dans le protocole de requête vous permettant d'obtenir le type de fichier (dir) de chaque nœud, donc une heuristique comme celui que vous avez trouvé est la seule solution.
Si l'obtention de la taille de chaque nœud ne fonctionne pas, peut-être vous devriez envisager de demander
FTP.nlst()
sur chacun de ces nœuds: ceux que l'erreur sera fichiers, plutôt que de dirs.FTP.dir
retourne une liste de répertoire, que vous pouvez analyser avec une fonction de rappel pour savoir si c'est un répertoire. Par exemple, comme ceci:Il n'y a pas "isdir" et "isfile" définitions dans ftplib. Si vous n'avez pas à utiliser ftplib, je vous recommande d'utiliser ftputil.
Tout d'abord, vous devez installer ftputil paquet. Pour arriver à cela, utilisez cette commande:
python -m pip install ftputil
. Après l'installation, vous pouvez importer la bibliothèque de votre code. Je pense que c'est assez d'explication. Donc, nous allons aller à la mise en œuvre:Vous pouvez utiliser MLST commande:
Contre pyftpdlib serveur le code ci-dessus imprime:
Ce que vous avez à faire est d'analyser cette chaîne et de regarder pour le "type=dir" ou "type=redc" (répertoire actuel, comme dans ".") ou "type=pdir" (parent dir comme dans "..") via une expression régulière.
Si vous obtenez un match, cela signifie que le chemin indiqué se réfère à un répertoire.
Cela fonctionne parce que http://ftp.size retourne Aucun si c'est un répertoire.
Je l'ai utilisé pendant ftplib:
C'est ce que j'utilise pour trouver les répertoires dans un répertoire donné. Je retourne les noms de répertoire comme un ensemble, parce que je utiliser des ensembles plus tard dans le programme, mais vous pouvez laisser de côté l'ensemble de la création à la fin et retour le répertoire des noms de la liste, tuple, etc.
Ici est une autre solution. La moitié manière de l'écrire, j'ai réalisé qu'il a un problème. Si vous n'avez pas l'autorisation de modifier un dossier, il va lire un fichier à la place. Cela fonctionnera si vous avez accès à tout le dossier.
J'ai toujours affiché ce parce que peut-être il donnera quelques idées.
J'ai trouvé une solution, mais c'est peut-être pas le meilleur et je pense que ça peut être utile pour vous.
Cette fonction retourne TRUE si 'remote_name' est un fichier régulier, sinon retourne False.
Toute ma solution ressemble à ceci:
De sortie:
Tous les fichiers ont une extension, en utilisant split('.') il peut être décomposé en une liste de taille 2. Alors que pour les répertoires de la taille de la liste sera l'un après l'utilisation de split('.'). Donc par vérifier la taille de la liste que l'on peut identifier si c'est un fichier ou un répertoire.