128 votes

Python os.path.join() sur une liste

Je peux le faire.

>>> os.path.join("c:/","home","foo","bar","some.txt")
'c:/home\\foo\\bar\\some.txt'

Mais, quand je le fais

>>> s = "c:/,home,foo,bar,some.txt".split(",")
>>> os.path.join(s)
['c:/', 'home', 'foo', 'bar', 'some.txt']

Qu'est-ce que je rate ici ?

236voto

ATOzTOA Points 9045

Le problème est que, os.path.join ne prend pas de list comme argument, il doit s'agir d'arguments séparés.

C'est là que * l'opérateur "splat" entre en jeu...

Je peux le faire.

>>> s = "c:/,home,foo,bar,some.txt".split(",")
>>> os.path.join(*s)
'c:/home\\foo\\bar\\some.txt'

30voto

Thorsten Kranz Points 5563

En supposant que join n'a pas été conçue de cette manière (ce qui est le cas, comme l'a souligné ATOzTOA), et qu'elle ne prend que deux paramètres, vous pouvez toujours utiliser la fonction intégrée reduce :

>>> reduce(os.path.join,["c:/","home","foo","bar","some.txt"])
'c:/home\\foo\\bar\\some.txt'

La même sortie comme :

>>> os.path.join(*["c:/","home","foo","bar","some.txt"])
'c:/home\\foo\\bar\\some.txt' 

Juste pour être complet et pour des raisons éducatives (et pour d'autres situations où * ne fonctionne pas).

Astuce pour Python 3

reduce a été déplacé vers le functools module.

16voto

phresnel Points 20082

J'ai trébuché sur la situation où la liste pourrait être vide. Dans ce cas :

os.path.join('', *the_list_with_path_components)

Notez le premier argument, qui ne modifiera pas le résultat.

10voto

Greg Points 1453

C'est juste la méthode. Il ne vous manque rien. Le site documentation officielle montre que vous pouvez utiliser le dépaquetage par liste pour fournir plusieurs chemins :

s = "c:/,home,foo,bar,some.txt".split(",")
os.path.join(*s)

Notez le *s au lieu de seulement s en os.path.join(*s) . L'utilisation de l'astérisque déclenche le dépaquetage de la liste, ce qui signifie que chaque argument de la liste sera fourni à la fonction comme un argument séparé.

2voto

Nishant Points 1080

Cette opération peut également être considérée comme une simple opération de réduction de carte si vous souhaitez l'envisager du point de vue de la programmation fonctionnelle.

import os
folders = [("home",".vim"),("home","zathura")]
[reduce(lambda x,y: os.path.join(x,y), each, "") for each in folders]

reduce est intégré dans Python 2.x. Dans Python 3.x, il a été déplacé dans le fichier itertools Cependant, plus la réponse est acceptée, mieux c'est.

La réponse à cette question a été donnée ci-dessous, mais vous pouvez y répondre si vous avez une liste d'articles à joindre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X