파이썬으로 디렉토리를 반복


157

주어진 디렉토리의 하위 디렉토리를 반복하고 파일을 검색해야합니다. 파일을 받으면 파일을 열고 내용을 변경하고 내 줄로 바꿔야합니다.

나는 이것을 시도했다 :

import os

rootdir ='C:/Users/sid/Desktop/test'

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        f=open(file,'r')
        lines=f.readlines()
        f.close()
        f=open(file,'w')
        for line in lines:
            newline = "No you are not"
            f.write(newline)
        f.close()

하지만 오류가 발생했습니다. 내가 뭘 잘못하고 있죠?


12
"오류"-특히 오류가 있습니까?
Daniel Roseman

1
파일 / 디렉토리가 의도 한대로 작동하게되면 파일 / 디렉토리로 무엇을하고자하는지 조금 설명해 주시겠습니까? 또한 오류 정보를 제공하십시오.
ChrisProsser

1
가져 오는 오류 메시지는 cool.txt 파일을 찾을 수 없다는 것입니다. 내 테스트 폴더에는 src라는 다른 폴더가 있고 src 폴더에는 main이라는 다른 폴더가 있습니다.이 폴더에는 cool.txt가 있습니다
Wolf

4
질문에 오류를 쓸 수 있습니까? 그것을 찾기 위해 주석을 읽어야 할 필요가 없습니다.
찰리 파커

1
1 년이 지난 후 오류를 게시하도록 다시 요청하고 있다고 믿을 수 없습니까? @ 울프
찰리 파커

답변:


300

디렉토리를 실제로 살펴보면 코딩 한대로 작동합니다. 내부 루프의 내용을 간단한 print명령문으로 바꾸면 각 파일이 있음을 알 수 있습니다.

import os
rootdir = 'C:/Users/sid/Desktop/test'

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        print os.path.join(subdir, file)

위를 실행할 때 여전히 오류가 발생하면 오류 메시지를 제공하십시오.


Python3 용으로 업데이트

import os
rootdir = 'C:/Users/sid/Desktop/test'

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        print(os.path.join(subdir, file))

1
C : / Users / sid / Desktop / test \ src \ app / cool.txt C : / Users / sid / Desktop / test \ src \ app / woohoo.txt 나중에 내 코드의 열린 문장에서, 내가해야한다고 생각 파일의 절대 경로를 제공하십시오. os.walk (rootdir)의 하위 디렉토리, 디렉토리, 파일의 경우 os rootdir = 'C : / Users / spemmara / Desktop / test / src / app /'가져 오기 : 파일의 파일 : f = open (subdir + '/'+ 파일 , 'r') lines = f.readlines () f.close () f = open (subdir + '/'+ file, 'w') 줄의 줄 : newline = "hey i know"f.write (newline) f.close () 고맙습니다. 해결
울프

3
안녕하세요! 파이썬 3의 "print"는 괄호를 필요로하며, 그렇지 않으면 구문 오류를 반환합니다. 도움이 되었기를 바랍니다!
Tommaso Di Noto

14

서브 디렉토리의 모든 파일을 리턴하는 또 다른 방법은 Python 3.4에 도입 된 모듈 을 사용 하여pathlib 파일 시스템 경로를 처리하는 객체 지향 접근 방식을 제공하는 것입니다 (PyPi 의 pathlib2 모듈을 통해 Python 2.7에서도 Pathlib를 사용할 수 있음 ).

from pathlib import Path

rootdir = Path('C:/Users/sid/Desktop/test')
# Return a list of regular files only, not directories
file_list = [f for f in rootdir.glob('**/*') if f.is_file()]

# For absolute paths instead of relative the current dir
file_list = [f for f in rootdir.resolve().glob('**/*') if f.is_file()]

Python 3.5부터이 glob모듈은 재귀 파일 찾기를 지원합니다.

import os
from glob import iglob

rootdir_glob = 'C:/Users/sid/Desktop/test/**/*' # Note the added asterisks
# This will return absolute paths
file_list = [f for f in iglob('**/*', recursive=True) if os.path.isfile(f)]

file_list위의 방법 중 하나에서이 중첩 루프를 필요로하지 않고 이상 반복 할 수 있습니다 :

for f in file_list:
    print(f) # Replace with desired operations

1
파이썬 3.6에서 선호되는 것은 무엇입니까?
PhoenixDev

@PhoenixDev 하나의 접근법이 다른 것보다 일반적으로 권장되는 것을 듣지 못했습니다. 나는 pathlib주로 객체 지향 메소드-구문을 좋아하기 때문에 나 자신을 사용하는 것을 선호 합니다. 경로 라이브러리가 문자열이 아닌 특정 경로 클래스를 반환하는 등 다른 차이점이 있으며 사용 가능한 기능은 라이브러리마다 다릅니다 (예 : os.path.expanduser('~')vs Path.home()). 설명서를 탐색하고 원하는 접근 방식을 확인하십시오.
joelostblom 2016 년

**glob 패턴 을 추가하는 대신을 사용할 수 있습니다 rglob.
Georgy

12

현재로 2020 , glob.iglob(path/**, recursive=True)가장 보인다 파이썬 솔루션, 즉 :

import glob, os

for filename in glob.iglob('/pardadox-music/**', recursive=True):
    if os.path.isfile(filename): # filter dirs
        print(filename)

산출:

/pardadox-music/modules/her1.mod
/pardadox-music/modules/her2.mod
...

참고 :
1- glob.iglob

glob.iglob(pathname, recursive=False)

glob()실제로 모든 값을 동시에 저장하지 않고 동일한 값을 생성하는 반복자를 반환합니다 .

2 - 재귀 인 경우 True, 패턴은 '**'모든 파일과 0 개 이상의 일치 directoriessubdirectories.

3-디렉토리에 파일이 포함되어 있으면  .기본적으로 일치하지 않습니다. 예를 들어, 디렉토리가 포함 된 고려  card.gif 하고 .card.gif:

>>> import glob
>>> glob.glob('*.gif') ['card.gif'] 
>>> glob.glob('.c*')['.card.gif']

4 - 또한 사용할 수있는 rglob(pattern)호출과 같은 인  glob() 으로 **/지정된 상대 패턴 앞에 첨가.


1
pythonic 솔루션은 숨겨진 파일 (일명 도트 파일)을 나열하지 않지만 허용되는 파일은 나열하지 않습니다.
ashrasmun

@ashrasmun 당신이 언급 한 것은 docs.python.org/3/library/glob.html
CONvid19
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.