J'essaie d'apprendre le python et je crée un programme qui produira un script. Je veux utiliser os.path.join, mais je suis assez confus. D'après la documentation si je dis:
os.path.join('c:', 'sourcedir')
Je reçois "C:sourcedir"
. Selon la documentation, c'est normal, non?
Mais lorsque j'utilise la commande copytree, Python le sortira de la manière souhaitée, par exemple:
import shutil
src = os.path.join('c:', 'src')
dst = os.path.join('c:', 'dst')
shutil.copytree(src, dst)
Voici le code d'erreur que j'obtiens:
WindowsError: [Erreur 3] Le système ne trouve pas le chemin spécifié: 'C: src /*.*'
Si j'emballe le os.path.join
avec, os.path.normpath
j'obtiens la même erreur.
Si cela os.path.join
ne peut pas être utilisé de cette façon, alors je ne sais pas quel but.
Selon les pages suggérées par Stack Overflow, les barres obliques ne doivent pas être utilisées dans la jointure - c'est correct, je suppose?
la source
os.path.join
ouos.sep
si vous allez le spécifierc:
quand même?c:
n'a aucun sens sur les autres systèmes d'exploitation.os.path.join('c:','folder')
fonctionne différemment deos.path.join('folder','file')
? Est-ce à cause du:
ou parce que «c:» est un lecteur?Pour être encore plus pédant, la réponse la plus cohérente de la documentation python serait:
Puisque vous avez également besoin de os.sep pour le chemin racine de posix:
la source
os.sep
supérieur?os.sep
. Cela ne fonctionne qu'après la lettre de lecteur nue. >>> os.path.join ("C: \ goodbye", os.sep, "temp") 'C: \\ temp'os.sep
est utile lorsque vous souhaitez manipuler des chemins sans faire d'hypothèses sur le séparateur. Il est inutile de l'utiliseros.path.join()
car il connaît déjà le bon séparateur. Il est également inutile si vous finissez par avoir besoin de spécifier explicitement le répertoire racine par son nom (comme vous pouvez le voir dans votre propre exemple). Pourquoi faire"c:" + os.sep
au lieu de simplement"c:\\"
, ouos.sep + "usr"
au lieu de simplement"/usr"
? Notez également que dans les shells Win, vous ne pouvez pascd c:
mais vous pouvezcd c:\
, ce qui suggère que le nom racine est en faitc:\
.La raison
os.path.join('C:', 'src')
ne fonctionne pas comme prévu est à cause de quelque chose dans la documentation que vous avez lié:Comme Ghostdog l'a dit, tu veux probablement
mypath=os.path.join('c:\\', 'sourcedir')
la source
Pour une solution indépendante du système qui fonctionne à la fois sur Windows et Linux, quel que soit le chemin d'entrée, on pourrait utiliser
os.path.join(os.sep, rootdir + os.sep, targetdir)
Sur Windows:
Sous Linux:
la source
c:
n'existe pas sur * nix, etusr
n'existe pas sur Windows ..os.path.join(os.sep, rootdir + os.sep, targetdir)
est indépendant du système précisément parce qu'il fonctionne avec ces deux exemples spécifiques au système, sans avoir besoin de changer le code.rootdir = "usr" if nix else "c:"
. Mais le plus direct et précisrootdir = "/usr" if nix else "c:\\"
fonctionne aussi bien, sans lesos.sep
acrobaties et les grattages de tête qui en résultent. Il n'y a aucun danger qu'un répertoire racine sur * nix commence par autre chose qu'une barre oblique, ou que Windows ait des répertoires racine nommés sans deux-points et une barre oblique inverse (par exemple, dans les shells Win, vous ne pouvez pas simplement fairecd c:
, vous besoin de spécifier la barre oblique inverse de fin), alors pourquoi prétendre le contraire?Pour être pédant, il n'est probablement pas bon de coder en dur soit / ou \ comme séparateur de chemin. Ce serait peut-être mieux?
ou
la source
Je dirais que c'est un bogue Python (Windows).
Pourquoi bug?
Je pense que cette déclaration devrait être
True
Mais c'est
False
sur les machines Windows.la source
pour rejoindre un chemin Windows, essayez
en gros, vous devrez échapper à la barre oblique
la source
Vous avez quelques approches possibles pour traiter le chemin sur Windows, des plus codées en dur (comme l'utilisation de littéraux de chaîne bruts ou l'échappement de barres obliques inverses) aux plus petites. Voici quelques exemples qui fonctionneront comme prévu. Utilisez ce qui correspond le mieux à vos besoins.
la source
Consentement avec @ georg-
Je dirais alors pourquoi nous avons besoin de boiteux
os.path.join
- mieux utiliserstr.join
ouunicode.join
par exemplela source
répondant à votre commentaire: "les autres '//' 'c:', 'c: \\' n'ont pas fonctionné (C: \\ a créé deux contre-obliques, C: \ n'a pas fonctionné du tout)"
Sur Windows, l'utilisation
os.path.join('c:', 'sourcedir')
ajoutera automatiquement deux barres obliques inverses\\
devant sourcedir .Pour résoudre le chemin, comme python fonctionne également sur Windows avec des barres obliques -> '/' , ajoutez simplement
.replace('\\','/')
avecos.path.join
comme ci-dessous: -os.path.join('c:\\', 'sourcedir').replace('\\','/')
par exemple:
os.path.join('c:\\', 'temp').replace('\\','/')
sortie: 'C: / temp'
la source
Les solutions proposées sont intéressantes et offrent une bonne référence, mais elles ne sont que partiellement satisfaisantes. Il est possible d'ajouter manuellement le séparateur lorsque vous avez un seul cas spécifique ou que vous connaissez le format de la chaîne d'entrée, mais il peut y avoir des cas où vous souhaitez le faire par programme sur des entrées génériques.
Avec un peu d'expérimentation, je pense que le critère est que le délimiteur de chemin n'est pas ajouté si le premier segment est une lettre de lecteur, c'est-à-dire une seule lettre suivie de deux points, peu importe si cela correspond à une unité réelle.
Par exemple:
Un moyen pratique de tester les critères et d'appliquer une correction de chemin peut être d'utiliser la
os.path.splitdrive
comparaison du premier élément renvoyé à la valeur de test, commet+os.path.sep if os.path.splitdrive(t)[0]==t else t
.Tester:
il peut probablement être amélioré pour être plus robuste pour les espaces de fin, et je ne l'ai testé que sur windows, mais j'espère que cela donne une idée. Voir aussi Os.path: pouvez-vous expliquer ce comportement? pour des détails intéressants sur les systèmes autres que Windows.
la source