[python] 디렉토리의 모든 파일을 나열하려면 어떻게합니까?



Answers

glob 모듈을 사용하는 것을 선호합니다. 패턴 일치 및 확장을 수행하기 때문입니다.

import glob
print(glob.glob("/home/adam/*.txt"))

쿼리 된 파일 목록을 반환합니다.

['/home/adam/file1.txt', '/home/adam/file2.txt', .... ]
Question

파이썬에서 디렉토리의 모든 파일을 list 하고 list 추가하려면 어떻게합니까?




List all files in a directory:

import os
from os import path

files = [x for x in os.listdir(directory_path) if path.isfile(directory_path+os.sep+x)]

Here, you get list of all files in a directory.




Returning a list of absolute filepaths, does not recurse into subdirectories

L = [os.path.join(os.getcwd(),f) for f in os.listdir('.') if os.path.isfile(os.path.join(os.getcwd(),f))]



나는 adamk의 답을 좋아 했다 . 같은 이름의 모듈에서 glob() 를 사용하도록 제안했다. 이렇게하면 * 와 일치하는 패턴을 가질 수 있습니다.

그러나 다른 사람들이 주석에서 지적했듯이 glob() 은 일관성없는 슬래시 방향을 넘어서게 될 수 있습니다. 이를 돕기 위해 os.path 모듈에서 join()expanduser() getcwd() 함수를 사용하고 os 모듈에서 getcwd() 함수를 사용하는 것이 좋습니다.

예를 들면 다음과 같습니다.

from glob import glob

# Return everything under C:\Users\admin that contains a folder called wlp.
glob('C:\Users\admin\*\wlp')

위는 끔찍합니다. 경로는 하드 코드되었으며 드라이브 이름과 경로 사이에 하드 코드 된 \ s 사이의 Windows에서만 작동합니다.

from glob    import glob
from os.path import join

# Return everything under Users, admin, that contains a folder called wlp.
glob(join('Users', 'admin', '*', 'wlp'))

위의 더 잘 작동하지만 폴더 이름 Users 는 종종 Windows에서 발견되며 다른 OS에서는 자주 발견되지 않습니다. 또한 특정 이름 인 admin 을 사용하는 사용자에게 의존합니다.

from glob    import glob
from os.path import expanduser, join

# Return everything under the user directory that contains a folder called wlp.
glob(join(expanduser('~'), '*', 'wlp'))

이것은 모든 플랫폼에서 완벽하게 작동합니다.

플랫폼에서 완벽하게 작동하고 조금 다른 점이있는 또 다른 훌륭한 예 :

from glob    import glob
from os      import getcwd
from os.path import join

# Return everything under the current directory that contains a folder called wlp.
glob(join(getcwd(), '*', 'wlp'))

이 예제가 표준 Python 라이브러리 모듈에서 찾을 수있는 몇 가지 기능의 힘을 이해하는 데 도움이되기를 바랍니다.




Due to the fact that SO 's post (question / answer) limit is 30000 chars ( [Meta.SE]: Knowing Your Limits: What is the maximum length of a question title, post, image and links used? ),
this answer is a continuation of
[SO]: How do I list all files of a directory? (@CristiFati's answer - Part One)


Part Two

Solutions (continued)

Other approaches:

  1. Use Python only as a wrapper

    • Everything is done using another technology
    • That technology is invoked from Python
    • The most famous flavor that I know is what I call the sysadmin approach:

      • Use Python (or any programming language for that matter) in order to execute shell commands (and parse their outputs - in general this approach is to be avoided, since if some command output format slightly differs between OS versions/flavors, the parsing code should be adapted as well; not to mention non EN locales)
      • Some consider this a neat hack
      • I consider it more like a lame workaround ( gainarie ), as the action per se is performed from shell ( cmd in this case), and thus doesn't have anything to do with Python
      • Filtering ( grep / findstr ) or output formatting could be done on both sides, but I'm not going to insist on it. Also, I deliberately used os.system instead of subprocess.Popen
      (py35x64_test) E:\Work\Dev\\q003207219>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" -c "import os;os.system(\"dir /b root_dir\")"
      dir0
      dir1
      dir2
      dir3
      file0
      file1
      


Final note(s) :

  • I will try to keep it up to date, any suggestions are welcome, I will incorporate anything useful that will come up into the answer(s)



If you care about performance, try scandir , for Python 2.x, you may need to install it manually. 예 :

# python 2.x
import scandir
import sys

de = scandir.scandir(sys.argv[1])
while 1:
    try:
        d = de.next()
        print d.path
    except StopIteration as _:
        break

This save a lot of time when you need to scan a huge directory, you do not need to buffer a huge list, just fetch one by one. And also you can do it recursively:

def scan_path(path):
    de = scandir.scandir(path)
    while 1:
        try:
            e = de.next()
            if e.is_dir():
                scan_path(e.path)
            else:
                print e.path
        except StopIteration as _:
                break



원본 경로와 파일 형식을 입력으로 제공 할 수있는 샘플 라이너를 제공합니다. 이 코드는 csv 확장자를 가진 파일 이름 목록을 반환합니다. 사용 . 모든 파일을 반환해야하는 경우에 사용합니다. 또한 서브 디렉토리를 재귀 적으로 스캔합니다.

[y for x in os.walk(sourcePath) for y in glob(os.path.join(x[0], '*.csv'))]

필요에 따라 파일 확장자 및 소스 경로를 수정하십시오.




find 의 파이썬 구현을 찾고 있다면, 이것은 내가 자주 사용하는 방법입니다 :

from findtools.find_files import (find_files, Match)

# Recursively find all *.sh files in **/usr/bin**
sh_files_pattern = Match(filetype='f', name='*.sh')
found_files = find_files(path='/usr/bin', match=sh_files_pattern)

for found_file in found_files:
    print found_file

그래서 PyPI package 만들었고 GitHub 저장소도 있습니다. 누군가이 코드에서 잠재적으로 유용하다고 생각하기를 바랍니다.




다음은 간단한 예입니다.

import os
root, dirs, files = next(os.walk('.'))
for file in files:
    print(file) # In Python 3 use: file.encode('utf-8') in case of error.

Note: Change . to your path value or variable.

Here is the example returning list of files with absolute paths:

import os
path = '.' # Change this as you need.
abspaths = []
for fn in os.listdir(path):
    abspaths.append(os.path.abspath(os.path.join(path, fn)))
print("\n".join(abspaths))

Documentation: os and os.path for Python 2, os and os.path for Python 3.




Using generators

import os
def get_files(search_path):
     for (dirpath, _, filenames) in os.walk(search_path):
         for filename in filenames:
             yield os.path.join(dirpath, filename)
list_files = get_files('.')
for filename in list_files:
    print(filename)



파일 목록보기

나는 또한 짧은 비디오를 여기에 만들었다 : Video

os.listdir () : 현재 디렉토리에서 파일 가져 오기 (Python 3)

파이썬 3에서 현재 디렉토리에 파일을 저장하는 가장 간단한 방법은 이것입니다. 그것은 정말 간단하고, os 모듈과 listdir () 함수를 사용하면 dir (그리고 dir에있는 최종 폴더에 파일이 있지만 하위 디렉토리에는이 파일을 사용할 수 없습니다. 걷다 - 나는 나중에 그것에 대해 이야기 할 것이다).

>>> import os
>>> arr = os.listdir()
>>> arr
['$RECYCLE.BIN', 'work.txt', '3ebooks.txt', 'documents']

전체 경로 이름 가져 오기

위에서 알 수 있듯이 위의 코드에서 파일의 전체 경로가 없습니다. 절대 경로가 필요한 경우 os.listdir ()에서 가져온 파일을 인수로 넣어 _getfullpathname이라는 os.path 모듈의 다른 함수를 사용할 수 있습니다. 우리가 나중에 점검 할 것처럼 전체 경로를 가질 수있는 다른 방법이 있습니다 (mexmex에서 제안한대로, _getfullpathname을 abspath로 대체했습니다).

>>> import os
>>> files_path = [os.path.abspath(x) for x in os.listdir())]
>>> files_path
['F:\\documenti\applications.txt', 'F:\\documenti\collections.txt']

walk이있는 모든 하위 디렉토리에 파일 유형의 전체 경로 이름을 가져옵니다.

나는 이것을 여러 디렉토리에서 찾을 때 매우 유용하다고 생각하며, 그 이름을 기억하지 못하는 파일을 찾는 데 도움이되었습니다.

import os

thisdir = os.getcwd()
for r, d, f in os.walk(thisdir):
    for file in f:
        if ".docx" in file:
            print(os.path.join(r, file))

os.listdir () : 현재 디렉토리에서 파일 가져 오기 (Python 2)

>>> import os
>>> arr = os.listdir('.')
>>> arr
['$RECYCLE.BIN', 'work.txt', '3ebooks.txt', 'documents']

디렉토리 트리에 올라가려면

>>> # method 1
>>> x = os.listdir('..')

# method 2
>>> x= os.listdir('/')

파일 가져 오기 : 특정 디렉토리의 os.listdir () (Python 2 및 3)

>>> import os
>>> arr = os.listdir('F:\\python')
>>> arr
['$RECYCLE.BIN', 'work.txt', '3ebooks.txt', 'documents']

os.listdir ()을 사용하여 특정 하위 디렉토리의 파일 가져 오기

import os

x = os.listdir("./content")

os.walk ( '.') - 현재 디렉토리

>>> import os
>>> arr = next(os.walk('.'))[2]
>>> arr
['5bs_Turismo1.pdf', '5bs_Turismo1.pptx', 'esperienza.txt']

glob 모듈 - 모든 파일

import glob
print(glob.glob("*"))

out:['content', 'start.py']

다음 (os.walk ( '.')) 및 os.path.join ( 'dir', 'file')

>>> import os
>>> arr = []
>>> for d,r,f in next(os.walk("F:\_python)):
>>>     for file in f:
>>>         arr.append(os.path.join(r,file))
...
>>> for f in arr:
>>>     print(files)

>output

F:\\_python\\dict_class.py
F:\\_python\\programmi.txt

다음 (os.walk ( 'F : \') - 전체 경로 얻기 - 목록 이해

>>> [os.path.join(r,file) for r,d,f in next(os.walk("F:\\_python")) for file in f]
['F:\\_python\\dict_class.py', 'F:\\_python\\programmi.txt']

os.walk - 전체 경로 가져 오기 - 하위 디렉토리의 모든 파일

x = [os.path.join(r,file) for r,d,f in os.walk("F:\\_python") for file in f]

>>>x
['F:\\_python\\dict.py', 'F:\\_python\\progr.txt', 'F:\\_python\\readl.py']

os.listdir () - txt 파일 만 가져 오기

>>> arr_txt = [x for x in os.listdir() if x.endswith(".txt")]
>>> print(arr_txt)
['work.txt', '3ebooks.txt']

glob - txt 파일 만 가져 오기

>>> import glob
>>> x = glob.glob("*.txt")
>>> x
['ale.txt', 'alunni2015.txt', 'assenze.text.txt', 'text2.txt', 'untitled.txt']

glob을 사용하여 파일의 전체 경로 얻기

파일의 절대 경로가 필요할 경우 :

>>> from path import path
>>> from glob import glob
>>> x = [path(f).abspath() for f in glob("F:\*.txt")]
>>> for f in x:
...  print(f)
...
F:\acquistionline.txt
F:\acquisti_2018.txt
F:\bootstrap_jquery_ecc.txt

glob의 다른 사용법

디렉토리에있는 모든 파일을 원한다면 :

>>> x = glob.glob("*")

os.path.isfile을 사용하여 목록에있는 디렉토리를 피하십시오 *

import os.path
listOfFiles = [f for f in os.listdir() if os.path.isfile(f)]
print(listOfFiles)

> output

['a simple game.py', 'data.txt', 'decorator.py']

pathlib (Python 3.4) 사용하기

import pathlib

>>> flist = []
>>> for p in pathlib.Path('.').iterdir():
...  if p.is_file():
...   print(p)
...   flist.append(p)
...
error.PNG
exemaker.bat
guiprova.mp3
setup.py
speak_gui2.py
thumb.PNG

목록 이해력을 사용하려면

>>> flist = [p for p in pathlib.Path('.').iterdir() if p.is_file()]

os.walk로 모든 파일 만 가져 오기

import os
x = [i[2] for i in os.walk('.')]
y=[]
for t in x:
    for f in t:
        y.append(f)

>>> y
['append_to_list.py', 'data.txt', 'data1.txt', 'data2.txt', 'data_180617', 'os_walk.py', 'READ2.py', 'read_data.py', 'somma_defaltdic.py', 'substitute_words.py', 'sum_data.py', 'data.txt', 'data1.txt', 'data_180617']

다음 파일 만 가져 와서 디렉토리로 이동

>>> import os
>>> x = next(os.walk('F://python'))[2]
>>> x
['calculator.bat','calculator.py']

다음 디렉토리 만 가져 와서 디렉토리를 방문하십시오.

>>> import os
>>> next(os.walk('F://python'))[1] # for the current dir use ('.')
['python3','others']

** 도보로 모든 하위 디렉토리 이름 가져 오기

>>> for r,d,f in os.walk("F:\_python"):
...  for dirs in d:
...   print(dirs)
...
.vscode
pyexcel
pyschool.py
subtitles
_metaprogramming
.ipynb_checkpoints

파이썬 3.5에서 os.scandir ()

>>> import os
>>> x = [f.name for f in os.scandir() if f.is_file()]
>>> x
['calculator.bat','calculator.py']

# Another example with scandir (a little variation from docs.python.org)
# This one is more efficient than os.listdir. 
# In this case, it shows the files only in the current directory 
# where the script is executed.

>>> import os
>>> with os.scandir() as i:
...  for entry in i:
...   if entry.is_file():
...    print(entry.name)
...
ebookmaker.py
error.PNG
exemaker.bat
guiprova.mp3
setup.py
speakgui4.py
speak_gui2.py
speak_gui3.py
thumb.PNG
>>>

전의. 1 : 하위 디렉토리에 몇 개의 파일이 있습니까?

이 예에서는 모든 디렉토리와 서브 디렉토리에 포함 된 파일의 수를 찾습니다.

import os

def count(dir, counter=0):
    "returns number of files in dir and subdirs"
    for pack in os.walk(dir):
        for f in pack[2]:
            counter += 1
    return dir + " : " + str(counter) + "files"


print(count("F:\\python"))

> output

>'F:\\\python' : 12057 files'

예 2 : dir에서 다른 dir로 모든 파일을 복사하는 방법

컴퓨터에서 유형의 모든 파일 (기본값 : pptx)을 찾은 다음 새 폴더에 복사하는 명령.

import os
import shutil
from path import path

destination = "F:\\file_copied"
# os.makedirs(destination)


def copyfile(dir, filetype='pptx', counter=0):
    "Searches for pptx (or other - pptx is the default) files and copies them"
    for pack in os.walk(dir):
        for f in pack[2]:
            if f.endswith(filetype):
                fullpath = pack[0] + "\\" + f
                print(fullpath)
                shutil.copy(fullpath, destination)
                counter += 1
    if counter > 0:
        print("------------------------")
        print("\t==> Found in: `" + dir + "` : " + str(counter) + " files\n")


for dir in os.listdir():
    "searches for folders that starts with `_`"
    if dir[0] == '_':
        # copyfile(dir, filetype='pdf')
        copyfile(dir, filetype='txt')


> Output

_compiti18\Compito Contabilità 1\conti.txt
_compiti18\Compito Contabilità 1\modula4.txt
_compiti18\Compito Contabilità 1\moduloa4.txt
------------------------
==> Found in: `_compiti18` : 3 files

전의. 3 : txt 파일의 모든 파일을 가져 오는 방법

모든 파일 이름을 가진 txt 파일을 만들려는 경우

import os
mylist = ""
with open("filelist.txt", "w", encoding="utf-8") as file:
    for eachfile in os.listdir():
        mylist += eachfile + "\n"
    file.write(mylist)



디렉토리 내용을 나열하려면 os 모듈을 사용해야합니다. os.listdir(".") 은 디렉토리의 모든 내용을 반환합니다. 결과를 반복하고 목록에 추가합니다.

import os

content_list = []

for content in os.listdir("."): # "." means current directory
    content_list.append(content)

print content_list



By using os library.

import os
for root, dirs,files in os.walk("your dir path", topdown=True):
    for name in files:
        print(os.path.join(root, name))



디렉토리 및 모든 하위 디렉토리에서 전체 파일 경로 얻기

import os

def get_filepaths(directory):
    """
    This function will generate the file names in a directory 
    tree by walking the tree either top-down or bottom-up. For each 
    directory in the tree rooted at directory top (including top itself), 
    it yields a 3-tuple (dirpath, dirnames, filenames).
    """
    file_paths = []  # List which will store all of the full filepaths.

    # Walk the tree.
    for root, directories, files in os.walk(directory):
        for filename in files:
            # Join the two strings in order to form the full filepath.
            filepath = os.path.join(root, filename)
            file_paths.append(filepath)  # Add it to the list.

    return file_paths  # Self-explanatory.

# Run the above function and store its results in a variable.   
full_file_paths = get_filepaths("/Users/johnny/Desktop/TEST")
  • 위의 함수에서 제공 한 경로에는 3 개의 파일이 포함되어 있는데 그 중 2 개는 루트 디렉토리에 있고 다른 하나는 "SUBFOLDER"라는 하위 폴더에 있습니다. 이제 다음과 같은 작업을 수행 할 수 있습니다.
  • 목록을 인쇄 할 print full_file_paths 를 인쇄하십시오.

    • ['/Users/johnny/Desktop/TEST/file1.txt', '/Users/johnny/Desktop/TEST/file2.txt', '/Users/johnny/Desktop/TEST/SUBFOLDER/file3.dat']

원한다면, 아래 코드와 같이 내용을 열고 읽을 수 있거나 확장명이 ".dat"인 파일에만 집중할 수 있습니다.

for f in full_file_paths:
  if f.endswith(".dat"):
    print f

/Users/johnny/Desktop/TEST/SUBFOLDER/file3.dat




Execute findfiles() with a directory as a parameter and it will return a list of all files in it.

import os
def findfiles(directory):
    objects = os.listdir(directory)  # find all objects in a dir

    files = []
    for i in objects:  # check if very object in the folder ...
        if os.path.isfile(os.path.join(directory, i)):  # ... is a file.
            files.append(i)  # if yes, append it.
    return files



Related