web-dev-qa-db-ja.com

open()に別のディレクトリのファイルのフルパスを渡す必要がありますか?

ループしたい10個のファイルがあるフォルダーがあります。ファイルの名前を印刷すると、私のコードは正常に機能します。

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

どの印刷:

1
2
3
4
5
6
7
8
9
10

しかし、ループでファイルを開こうとすると、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'
>>> 

ループ内でもopen()ファイルのフルパスを渡す必要がありますか?

62
balcoder

はい、フルパスが必要です。

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

簡単な修正です。コメントが指摘したように、os.walkはサブディレクトリに分類されるため、パス結合のベースとしてindirではなく現在のディレクトリルートを使用する必要があります。

26
koblas

単一のディレクトリでファイルを探している場合(つまり、notはディレクトリツリーを走査しようとしますが、このツリーは見えません) 、単に os.listdir() を使用しない理由:

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

os.walk() の代わりに。 os.listdir() のパラメータとしてディレクトリパスを指定できます。 os.path.isfile() は、指定されたファイル名がファイル用かどうかを決定します。

92
Levon

作業しているパスを指定する必要があります。

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

ドキュメント のos.walkの例は、これを行う方法を示しています。

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

文字列「1」が「/ home/des/test/1」(「/ home/des/test」が現在の作業ディレクトリである場合を除く)を意味することになっていることを「open」関数がどのように予想したか。

4
abarnert

ファイルツリーをたどるスニペットを次に示します。

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