web-dev-qa-db-fra.com

Dois-je passer le chemin complet d'un fichier dans un autre répertoire pour ouvrir ()?

J'ai un dossier avec dix fichiers que je veux parcourir en boucle. Quand j'imprime le nom du fichier, mon code fonctionne bien:

import os
indir = '/home/des/test'
for root, dirs, filenames in os.walk(indir):
    for f in filenames:
        print(f)

Quelles impressions:

1
2
3
4
5
6
7
8
9
10

Mais si j'essaie d'ouvrir le fichier dans la boucle, une erreur IO:

import os
indir = '/home/des/test'
for root, dirs, filenames in os.walk(indir):
    for f in filenames:
        log = open(f, 'r')

Traceback (most recent call last):
File "/home/des/my_python_progs/loop_over_dir.py", line 6, in <module>
log = open(f, 'r')
IOError: [Errno 2] No such file or directory: '1'
>>> 

Dois-je passer le chemin complet du fichier, même à l'intérieur de la boucle, pour open() les?

62
balcoder

Oui, vous avez besoin du chemin complet.

log = open(os.path.join(root, f), 'r')

Est la solution rapide. Comme l'a souligné le commentaire, os.walk decends en sous-répertoires, vous devez donc utiliser la racine du répertoire en cours plutôt que indir comme base pour la jointure du chemin.

26
koblas

Si vous ne cherchez que les fichiers dans un seul répertoire (c'est-à-dire que vous n'essayez pas d'essayer de parcourir une arborescence de répertoires, ce à quoi elle ne ressemble pas) , pourquoi ne pas simplement utiliser os.listdir () :

import os  
for fn in os.listdir('.'):
     if os.path.isfile(fn):
        print (fn)

à la place de os.walk () . Vous pouvez spécifier un chemin de répertoire en tant que paramètre pour os.listdir () . os.path.isfile () déterminera si le nom de fichier indiqué correspond à un fichier.

92
Levon

Vous devez spécifier le chemin sur lequel vous travaillez:

source = '/home/test/py_test/'
for root, dirs, filenames in os.walk(source):
    for f in filenames:
        print f
        fullpath = os.path.join(source, f)
        log = open(fullpath, 'r')
8
Mustafa

Les exemples de os.walk in la documentation montrent comment faire ceci:

for root, dirs, filenames in os.walk(indir):
    for f in filenames:
        log = open(os.path.join(root, f),'r')

Comment vous attendiez-vous à ce que la fonction "open" sache que la chaîne "1" est censée signifier "/ home/des/test/1" (à moins que "/ home/des/test" ne se trouve pas être votre répertoire de travail actuel)?

4
abarnert

Voici un extrait qui parcourt l’arborescence de fichiers pour vous:

indir = '/home/des/test'
for root, dirs, filenames in os.walk(indir):
    for f in filenames:
        print(f)
        log = open(indir + f, 'r')
4
Markos F