2012-08-03 5 views
58

루프를 통해 원하는 폴더가 10 개 있습니다. 내가 파일의 이름을 인쇄 할 때 내 코드는 잘 작동 :파이썬으로 파일을 반복하는 방법은 무엇입니까?

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

나는이 질문이 네살 인 것을 알고 있지만 아직 받아 들여지지 않은 대답을 가지고있다. – raoulcousins

답변

24

예, 전체 경로가 필요합니다.

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

퀵 픽스입니다. 주석에서 지적했듯이 os.walk은 하위 디렉토리로 분리되므로 경로 결합의 기본으로 indir이 아닌 현재 디렉토리 루트를 사용해야합니다.

+5

'os.walk'는 subdirs로 내려갑니다. 그래서 여기에서'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의 루프는 파일을 하나의 디렉토리에 인쇄하지 않습니다. 입력 디렉토리가없는 모든 디렉토리에 파일을 (재귀 적으로) 인쇄합니다. – 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 "뜻 것을 알고 기대했는데 어떻게/홈/des/test/1 "("/ home/des/test "가 현재 작업 디렉토리가 아닌 경우)?

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') 
관련 문제