ループしたい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()
ファイルのフルパスを渡す必要がありますか?
はい、フルパスが必要です。
log = open(os.path.join(root, f), 'r')
簡単な修正です。コメントが指摘したように、os.walk
はサブディレクトリに分類されるため、パス結合のベースとしてindir
ではなく現在のディレクトリルートを使用する必要があります。
単一のディレクトリでファイルを探している場合(つまり、notはディレクトリツリーを走査しようとしますが、このツリーは見えません) 、単に os.listdir() を使用しない理由:
import os
for fn in os.listdir('.'):
if os.path.isfile(fn):
print (fn)
os.walk() の代わりに。 os.listdir() のパラメータとしてディレクトリパスを指定できます。 os.path.isfile() は、指定されたファイル名がファイル用かどうかを決定します。
作業しているパスを指定する必要があります。
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')
ドキュメント の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」関数がどのように予想したか。
ファイルツリーをたどるスニペットを次に示します。
indir = '/home/des/test'
for root, dirs, filenames in os.walk(indir):
for f in filenames:
print(f)
log = open(indir + f, 'r')