62

ループしたい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()ますか?

4

5 に答える 5

92

単一のディレクトリでファイルを探しているだけの場合(つまり、ディレクトリツリーをトラバースしようとしていない場合は、そのようには見えません)、単にos.listdir()を使用してみませんか。

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

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

于 2012-08-03T18:32:13.667 に答える
26

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

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

クイックフィックスです。コメントが指摘しているように、サブディレクトリに降順するため、パス結合のベースとしてではos.walkなく、現在のディレクトリルートを使用する必要があります。indir

于 2012-08-03T18:32:00.047 に答える
8

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

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')
于 2016-01-31T13:15:03.887 に答える
4

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

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

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

于 2012-08-03T18:34:39.830 に答える
4

ファイルツリーをたどるスニペットは次のとおりです。

indir = '/home/des/test'
for root, dirs, filenames in os.walk(indir):
    for f in filenames:
        print(f)
        log = open(indir + f, 'r')
于 2015-08-06T19:49:47.053 に答える