La suppression du premier dossier dans un chemin
J'ai un chemin qui ressemble à
/First/Second/Third/Fourth/Fifth
et je voudrais enlever le First
, obtenant ainsi
Second/Third/Fourth/Fifth
La seule idée qui me vient en tête est d'utiliser de manière récursive os.path.split
mais cela ne semble pas optimale. Est-il une meilleure solution?
OriginalL'auteur meto | 2014-11-03
Vous devez vous connecter pour publier un commentaire.
Il n'y a vraiment rien dans le
os.path
module pour ce faire. Chaque si souvent, quelqu'un suggère la création d'unsplitall
fonction qui retourne une liste (ou un itérateur) de tous les composants, mais il n'a jamais eu assez de traction.En partie c'est parce que chaque fois que quelqu'un jamais suggéré d'ajouter de nouvelles fonctionnalités à
os.path
, il relancé de longue date de l'insatisfaction avec la conception générale de la bibliothèque, conduisant à quelqu'un de proposer un nouveau, plus OO, API pour les chemins de désapprouvé les os, maladroit API. En 3.4, qui s'est finalement produit, avecpathlib
. Et c'est déjà une fonctionnalité qui n'était pas dansos.path
. Donc:Ou... êtes-vous sûr que vous voulez vraiment supprimer le premier élément, plutôt que de faire cela?
Si vous avez besoin pour ce faire de la 2.6-2.7 et 3.2-3.3, il y a un backport de
pathlib
.Bien sûr, vous pouvez utiliser la manipulation de chaîne, aussi longtemps que vous êtes prudent de normaliser le chemin d'accès et à l'utilisation
os.path.sep
, et assurez-vous de gérer le délicat détails avec les chemins absolus ou avec des systèmes avec des lettres de lecteur, et...Ou vous pouvez juste envelopper de votre récursive
os.path.split
. Qu'est-ce exactement est pas "optimal" à ce sujet, une fois que vous l'envelopper? Il peut être un peu plus lent, mais nous parlons nanosecondes ici, de plusieurs ordres de grandeur plus rapide que même en l'appelantstat
sur un fichier. Il aura la récursivité approfondie des problèmes si vous avez un système de fichiers qui est de 1000 annuaires de profondeur, mais avez-vous déjà vu un? (Si oui, vous pouvez toujours vous tourner en boucle...), Il prend quelques minutes pour l'envelopper et écrire de bons tests unitaires, mais c'est quelque chose que vous venez de faire une fois et ne jamais s'inquiéter de nouveau. Donc, honnêtement, si vous ne voulez pas utiliserpathlib
, c'est ce que je ferais.pathlib
dosent venir avec python, besoin de l'installeren terme de performance que vous êtes tout à fait raison: nous parlons de nanosecondes; c'est plus moi qui essayais d'apprendre la meilleure façon / d'autres façons de le faire
La réponse explique en détail,
pathlib
est livré avec Python 3.4+, et vous pouvez installer le backport pour 2.6-2.7 et 3.2-3.3.Oui, c'est parfaitement raisonnable. C'est juste que souvent, quand les gens disent "optimiser" ou "efficace" ils sont vraiment demandé (temps) de la performance, dans les cas où il n'a pas vraiment d'importance, il est donc préférable d'être sûr de ce que les gens demandent...
une grave question: quelle serait la meilleure façon de demander des trucs comme ça, à votre avis?
OriginalL'auteur abarnert
Un peu comme une autre réponse, profitant de l'os.chemin d'accès :
... en supposant que votre chaîne de caractères commence par un séparateur.
Le * est utilisé pour traiter l'ensemble généré par
(x.split(os.path.sep)[2:])
comme le*args
mot-clé. Toutefois, cela ne fonctionne pas est le chemin d'accès est trop court depuis la liste des arguments sera complètement videOriginalL'auteur amyrit
Une approche simple
de sortie:
Dans ce code ci-dessus, j'ai divisé la chaîne. alors rejoint laissant 1er élément
À l'aide de
itertools.dropwhile
:il est plus efficace
OriginalL'auteur Hackaholic
Je cherchais s'il y avait un natif façon de le faire, mais il semble que cela ne fonctionne pas.
Je sais que ce sujet est vieux, mais c'est ce que j'ai fait pour m'amener à la meilleure solution:
Il y a deux principalement deux approches: l'utilisation de split() et à l'aide de len(). Les deux ont dû utiliser de découpage.
1) à l'Aide de la fonction split()
Résultat: --- 0.420122861862 secondes ---
*De supprimer le caractère "/" dans la ligne new_path = "/" + "/".... n'a pas amélioré les performances de trop.
2) à l'Aide de len(). Cette méthode ne fonctionnera que si vous fournissez le dossier si vous souhaitez supprimer
Résultat: --- 0.199596166611 secondes ---
*Même avec des "si" pour vérifier si le chemin commence par le nom de fichier, il a été deux fois plus rapide que la première méthode.
En résumé: chaque méthode a un pro et con. Si vous êtes absolument sûr de le dossier que vous souhaitez supprimer, utilisez la méthode deux, sinon je vous recommande d'utiliser la méthode 1 qui les gens d'ici l'avons mentionné précédemment.
OriginalL'auteur tupan