python 파이썬 확인 - 디렉토리의 모든 파일을 나열하려면 어떻게합니까?



15 Answers

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

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

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

['/home/adam/file1.txt', '/home/adam/file2.txt', .... ]
불러 오기 os

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




파이썬 2와 3으로 파일 목록보기

나는 또한 여기에 짧은 비디오를 만들었 : 파이썬 : 디렉토리에서 파일 목록을 얻는 방법

os.listdir ()

또는 ..... 현재 디렉토리 (파이썬 3)에서 모든 파일 (및 디렉토리)을 얻는 방법

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

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

glob 사용

나는 동일한 유형의 파일을 선택하거나 공통점이있는 파일을 선택하기가 쉽다는 것을 발견했다. 다음 예를보십시오.

import glob

txtfiles = []
for file in glob.glob("*.txt"):
    txtfiles.append(file)

목록 이해력 사용하기

import glob

mylist = [f for f in glob.glob("*.txt")]

os.path.abspath를 사용하여 전체 경로 이름 얻기

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

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

# Getting the current work directory (cwd)
thisdir = os.getcwd()

# r=root, d=directories, f = files
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)

파이썬 2에서는 현재 디렉토리에있는 파일 목록을 원한다면 인수를 '.'로 써야합니다. os.listdir 메소드에서 os.getcwd ()를 호출하십시오.

>>> 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()]

* pathlib.Path ( ".") 대신 pathlib.Path ()도 사용할 수 있습니다.

pathlib.Path ()에서 glob 메소드 사용

import pathlib

py = pathlib.Path().glob("*.py")
for file in py:
    print(file)

산출:

stack_overflow_list.py
stack_overflow_list_tkinter.py

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 : 디렉토리의 모든 파일을 다른 디렉토리로 복사하는 방법

컴퓨터에서 유형의 모든 파일 (기본값 : 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)

예 : 하드 드라이브의 모든 파일이있는 txt

"""We are going to save a txt file with all the files in your directory.
We will use the function walk()

"""

import os

# see all the methods of os
# print(*dir(os), sep=", ")
listafile = []
percorso = []
with open("lista_file.txt", "w", encoding='utf-8') as testo:
    for root, dirs, files in os.walk("D:\\"):
        for file in files:
            listafile.append(file)
            percorso.append(root + "\\" + file)
            testo.write(file + "\n")
listafile.sort()
print("N. of files", len(listafile))
with open("lista_file_ordinata.txt", "w", encoding="utf-8") as testo_ordinato:
    for file in listafile:
        testo_ordinato.write(file + "\n")

with open("percorso.txt", "w", encoding="utf-8") as file_percorso:
    for file in percorso:
        file_percorso.write(file + "\n")

os.system("lista_file.txt")
os.system("lista_file_ordinata.txt")
os.system("percorso.txt")

하나의 텍스트 파일에있는 C : \\의 모든 파일

이것은 이전 코드의 짧은 버전입니다. 다른 위치에서 시작해야하는 경우 파일 찾기를 시작할 폴더를 변경하십시오. 이 코드는 내 컴퓨터의 텍스트 파일에 50MB 이하의 파일을 생성하고 전체 경로가있는 파일은 500.000 줄을 생성합니다.

import os

with open("file.txt", "w", encoding="utf-8") as filewrite:
    for r, d, f in os.walk("C:\\"):
        for file in f:
            filewrite.write(f"{r + file}\n")    

특정 유형의 파일을 검색하는 기능

운영 체제 가져 오기

def searchfiles(extension='.ttf'):
    "Create a txt file with all the file of a type"
    with open("file.txt", "w", encoding="utf-8") as filewrite:
        for r, d, f in os.walk("C:\\"):
            for file in f:
                if file.endswith(extension):
                    filewrite.write(f"{r + file}\n")

# looking for ttf file (fonts)
searchfiles('ttf')



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

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




나는 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 라이브러리 모듈에서 찾을 수있는 몇 가지 기능의 힘을 이해하는 데 도움이되기를 바랍니다.




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

import os

content_list = []

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

print content_list



import os
lst=os.listdir(path)

os.listdir은 path에 의해 주어진 디렉토리에있는 엔트리의 이름을 포함하는리스트를 반환합니다.




Python 3.5는 디렉토리를 걷는 새로운 빠른 방법을 소개했습니다 - os.scandir().

예:

for file in os.scandir('/usr/bin'):
    line = ''
    if file.is_file():
        line += 'f'
    elif file.is_dir():
        line += 'd'
    elif file.is_symlink():
        line += 'l'
    line += '\t'
    print("{}{}".format(line, file.name))



디렉토리의 모든 파일 나열 :

import os
from os import path

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

여기에서는 디렉토리의 모든 파일 목록을 얻습니다.




# -** coding: utf-8 -*-
import os
import traceback

print '\n\n'

def start():
    address = "/home/ubuntu/Desktop"
    try:
        Folders = []
        Id = 1
        for item in os.listdir(address):
            endaddress = address + "/" + item
            Folders.append({'Id': Id, 'TopId': 0, 'Name': item, 'Address': endaddress })
            Id += 1         

            state = 0
            for item2 in os.listdir(endaddress):
                state = 1
            if state == 1: 
                Id = FolderToList(endaddress, Id, Id - 1, Folders)
        return Folders
    except:
        print "___________________________ ERROR ___________________________\n" + traceback.format_exc()

def FolderToList(address, Id, TopId, Folders):
    for item in os.listdir(address):
        endaddress = address + "/" + item
        Folders.append({'Id': Id, 'TopId': TopId, 'Name': item, 'Address': endaddress })
        Id += 1

        state = 0
        for item in os.listdir(endaddress):
            state = 1
        if state == 1: 
            Id = FolderToList(endaddress, Id, Id - 1, Folders)
    return Id

print start()



발전기 사용

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)



다른 파일 형식을 사용하거나 전체 디렉토리를 가져 오려면이 기능을 사용하십시오.

import os

def createList(foldername, fulldir = True, suffix=".jpg"):
    file_list_tmp = os.listdir(foldername)
    #print len(file_list_tmp)
    file_list = []
    if fulldir:
        for item in file_list_tmp:
            if item.endswith(suffix):
                file_list.append(os.path.join(foldername, item))
    else:
        for item in file_list_tmp:
            if item.endswith(suffix):
                file_list.append(item)
    return file_list



os라이브러리 를 사용 합니다.

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



@adamk의 대답을 참고하면, @Anti Earth의 슬래시 불일치 코멘트에 대한 응답으로 내 OS 탐지 방법 이 있습니다.

import sys
import os
from pathlib import Path
from glob import glob
platformtype = sys.platform
if platformtype == 'win32':
    slash = "\\"
if platformtype == 'darwin':
    slash = "/"

# TODO: How can I list all files of a directory in Python and add them to a list?

# Step 1 - List all files of a directory

# Method 1: Find only pre-defined filetypes (.txt) and no subfiles, answer provided by @adamk
dir1 = "%sfoo%sbar%s*.txt" % (slash)
_files = glob(dir1)

# Method 2: Find all files and no subfiles
dir2 = "%sfoo%sbar%s" % (slash)
_files = (x for x in Path("dir2").iterdir() if x.is_file())

# Method 3: Find all files and all subfiles
dir3 = "%sfoo%sbar" % (slash)
_files = (x for x in Path('dir3').glob('**/*') if x.is_file())


# Step 2 - Add them to a list

files_list = []
for eachfiles in _files:
    files_basename = os.path.basename(eachfiles)
    files_list.append(files_basename)
print(files_list)
['file1.txt', 'file2.txt', .... ]

목록에 basenames 만을 원한다고 가정 합니다.

방법 1의 여러 파일 형식을 미리 정의 하려면이 post 을 참조하십시오 .




정말 간단한 버전 :

import os
[f for f in os.listdir(os.getcwd) if ...]



제 2 부 1

솔루션 (계속)

다른 방법 :

  1. Python을 래퍼로만 사용하십시오.

    • 모든 것은 다른 기술을 사용하여 수행됩니다.
    • 이 기술은 Python 에서 호출됩니다.
    • 내가 아는 가장 유명한 맛은 내가 시스템 관리자 접근 방식 이라고 부르는 것이다 :

      • 사용 파이썬 실행하기 위해 (또는 그 문제에 대한 모든 프로그래밍 언어) 명령을 (자신의 출력을 구문 분석 - 일반적으로이 방법은 몇 가지 명령 출력 형식이 약간 사이에 다른 경우 때문에, 피해야하는 OS의 버전 / 맛, 구문 분석 코드가해야 EN 로고가 아닌 것은 말할 것도 없습니다. )
      • 일부는 이것을 깔끔한 해킹이라고 생각합니다.
      • 필자 는이 동작을 ( 이 경우 cmd) 에서 수행 하므로 Python 과 아무런 관련이 없으므로 불완전한 해결 방법 ( gainarie ) 과 같은 것으로 간주합니다 .
      • 필터링 ( grep/ findstr) 또는 출력 형식화는 양면에서 수행 될 수 있지만이를 주장하지는 않습니다. 또한, 나는 의도적으로 os.system대신 사용 했다 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
      

제 2 부 끝 1


1. Home 의 게시물 (질문 / 답변) 한도가 30000 자 ( [SE.Meta] : 귀하의 한계 파악 : 질문 제목, 게시물, 이미지 및 사용 된 링크의 최대 길이는 얼마입니까? )라는 사실 때문에, 대답은 2 부분으로 나누어 져 있습니다. [SO] : 디렉토리의 모든 파일을 나열하려면 어떻게합니까? 를 읽으십시오 . (@ CristiFati의 대답 - "파트 1") .




Related