croix-plate-forme de dédoublement de voie en python
Je voudrais quelque chose qui a le même effet que celui-ci:
>>> path = "/foo/bar/baz/file"
>>> path_split = path.rsplit('/')[1:]
>>> path_split
['foo', 'bar', 'baz', 'file']
Mais qui fonctionnera avec Windows chemins de trop. Je sais qu'il y a un os.path.split()
mais ce n'est pas faire ce que je veux, et je n'ai rien vu qui ne.
- BTW Python a
os.path
qui prend en charge votre système d'exploitation actuel chemin de la syntaxe, mais il y a aussi des OS spécifiques chemin de modules appelésposixpath
,ntpath
,macpath
etos2emxpath
avec la même interface.
Vous devez vous connecter pour publier un commentaire.
L'OP spécifié "fonctionne avec Windows chemins de trop". Il y a quelques rides avec des chemins d'accès Windows.
Tout d'abord, Windows a le concept de plusieurs lecteurs, chacun avec son propre répertoire de travail courant, et
'c:foo'
et'c:\\foo'
sont souvent pas les mêmes. Par conséquent, il est une très bonne idée de séparer n'importe quel lecteur de désignation d'abord, en utilisant le système d'exploitation.chemin d'accès.splitdrive(). Puis remontage du chemin d'accès (si nécessaire) peut être effectuée correctement pardrive + os.path.join(*other_pieces)
D'autre part, Windows chemins peuvent contenir des barres obliques ou des barres obliques inverses ou un mélange. Par conséquent, l'utilisation
os.sep
lors de l'analyse d'un unnormalised chemin n'est pas utile.Plus généralement:
Les résultats produits pour
'foo'
et'foo/'
ne doivent pas être identiques.La boucle de la résiliation de la condition semble être le mieux exprimé que "os.chemin d'accès.split() traité à son entrée en tant que unsplittable".
Voici une proposition de solution, avec des tests, y compris une comparaison avec @Spacedman la solution de
et voici la sortie (Python 2.7.1, Windows 7 Pro):
os_path_split_asunder(r'c:\windows\program files\winword.exe') >>> ['c:\\windows\\program files\\winword.exe']
os.path.normpath()
, afin de normaliser le chemin d'accès, puis de la diviser à l'aide deos.sep
. L'objectif devrait être behavorial l'identité, non pas littérale de l'identité. ('C:/dir/..\\file2' === 'C:\\file2').Python 3.4 introduit un nouveau module
pathlib
.pathlib.Path
fournit le système de fichiers des méthodes connexes, tandis quepathlib.PurePath
fonctionne entièrement indépendant du système de fichiers:Vous pouvez utiliser PosixPath et WindowsPath explicitement lorsque vous le souhaitez:
Et bien sûr, il fonctionne avec Windows chemins ainsi:
Huzzah pour Python devs constamment à l'amélioration de la langue!
pip install pathlib
Quelqu'un a dit "l'utilisation
os.path.split
". Cela a été supprimé malheureusement, mais c'est la bonne réponse.Il n'est donc pas juste de fendre le nom du dossier et le nom de fichier. Vous pouvez l'appliquer à plusieurs reprises pour obtenir le chemin d'accès complet dans un format portable et de façon correcte. Échantillon de Code:
Merci de crédit de l'auteur original si la réponse s'obtient récupérés.
1 + 2 + ... + n
et que la série estn * (n+1) / 2
, qui est en O(n^2)Utiliser la fonctionnalité fournie dans
os.path
, par exempleComme écrit ailleurs, vous pouvez l'appeler plusieurs fois pour diviser des chemins plus longs.
os.path.split()
juste divise en une paire dans le formulaire(dir, basename)
—pas ce que je veux.Utiliser la fonctionnalité fournie dans les os.chemin d'accès, par exemple
(Cette réponse a été par quelqu'un d'autre et a été mystérieusement et supprimé de manière incorrecte, puisqu'il s'agit d'une réponse; si vous voulez diviser chaque partie du chemin d'accès de l'autre, vous pouvez l'appeler plusieurs fois, et à chaque appel de tirer un composant hors de la fin.)
Voici explicite la mise en œuvre de l'approche qui vient de manière itérative
utilise
os.path.split
; utilise un peu différente de la boucle de licenciement condition que la accepté de répondre.Cela devrait satisfaire
os.path.join( *splitpath(path) )
estpath
dans le sens qu'ils indiquent tous deux le même fichier/répertoire.
Testé sous linux:
J'ai regardé un peu du DOS, à l'aide de la par le remplacement de
os.path
avecntpath
module, regarder OK pour moi, mais je ne suis pas trop familier avec les tenants et les aboutissants de DOS.Encore un essai avec maxplit option, qui est un remplacement de l'os.chemin d'accès.split()
Donc, gardez à l'aide de l'os.chemin d'accès.split jusqu'à ce que vous obtenez ce que vous voulez. Voici un truand de la mise en œuvre à l'aide d'une boucle infinie:
Bâton que dans parts.py, importer des pièces, et le tour est joué:
Probablement une meilleure mise en œuvre à l'aide de générateurs ou de la récursivité de la...
the_path.split(os.path.sep)
? juste pour dire...