2012-08-03 17 views
58

私はループしたい10個のファイルがあるフォルダを持っています。私は、ファイルの名前を印刷するとき、私のコードは正常に動作します:Pythonでファイルをループする方法は?

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: 
     print(f) 

印刷し、どの

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' 
>>> 

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

+0

あなたは、ディレクトリツリーをトラバースしようとしています、または特定のディレクトリ/フォルダ内の通常のファイルに興味がありますか? – Levon

+0

私はこの質問が4歳であることを知っていますが、それでも受け入れられた答えはありません。 – raoulcousins

答えて

24

はい、完全なパスが必要です。

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

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

+5

'os.walk'はサブディレクトリに下がりますので、ここでは' indir'を使うべきではありません。 'root'を使います。 –

+1

良いキャッチが更新されました。 – koblas

92

あなただけの(つまり、あなたはそれが似ていないディレクトリツリーを、トラバースしようとしてないある)単一のディレクトリ内のファイルを探しているなら、なぜ単にos.listdir()を使用しない:

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

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

+0

OPのループは1つのディレクトリにファイルを出力するだけではありません。それは入力ディレクトリの下にあるすべてのディレクトリにファイルを(再帰的に)出力します。 – mgilson

+0

@mgilson私はOPのコード(OPはディレクトリではなくファイル名のみを参照する)を見る際にそれを紛失していなければならず、質問の一部に「ループしたい10個のファイルがあるフォルダ」があります。 ..私はいくつかの情報をスキップしましたか? – Levon

+0

OPにディレクトリ構造がある場合: '.'は' file1'を含み、 'directory1'と' directory1'は 'file2'を含みます。 OPのコードは 'file1'、' file2'を出力しますが、あなたのソリューションは 'file1'、' directory1'を出力します。 (申し訳ありませんが、これはコメントで説明することは本当に難しいです)。 – mgilson

4

例はこれを行う方法を示しています

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

あなたが「オープン」機能は、「文字列「1」を意味することになっていることを知っていることを期待しましたか/ホーム/ "/ home/des/test"があなたの現在の作業ディレクトリでない限り、des/test/1 "になりますか?ここで

4

はあなたのためのファイルツリーを歩いていく抜粋です:

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

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

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') 
関連する問題