directory os教學 python搜尋檔案 - 如何列出目錄的所有文件?





15 Answers

我更喜歡使用glob模塊,因為它模式匹配和擴展。

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

它將返回包含查詢文件的列表:

['/home/adam/file1.txt', '/home/adam/file2.txt', .... ]
python讀取檔名 python讀取檔案路徑 python指定路徑

如何在Python中列出目錄的所有文件並將其添加到list




獲取Python 2和3的文件列表

我也在這裡做了一個簡短的視頻: Python:如何獲取目錄中的文件列表

os.listdir()

或.....如何獲取當前目錄中的所有文件(和目錄)(Python 3)

在Python 3中將文件放在當前目錄中的最簡單方法是這樣。 這很簡單; 使用os模塊和listdir()函數,你將擁有該目錄中的文件(以及目錄中的最終文件夾,但你不會在子目錄中有文件,因為你可以使用walk - 我會稍後談談)。

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

使用glob

我發現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.path模塊的另一個函數_getfullpathname ,將從os.listdir()獲得的文件作為參數。 還有其他方法可以獲得完整路徑,我們稍後會檢查(我更換了,如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

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

在Python 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']

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

next(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']

只獲取帶有next的文件並進入目錄

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

使用walk獲取所有子目錄名稱

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

來自Python 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:\\的所有文件都在一個文本文件中

這是以前代碼的較短版本。 如果需要從其他位置開始,請更改文件夾從哪裡開始查找文件。 此代碼在我的計算機上生成一個50 MB的文本文件,其中包含少於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個文件 - 其中兩個位於根目錄中,另一個位於名為“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() 。 這允許您與* s進行模式匹配。

但正如其他人在評論中指出的那樣, glob()可能會因不一致的斜線方向而被絆倒。 為了解決這個問題,我建議你在os.path模塊中使用join()expanduser()函數,也可以在os模塊中使用getcwd()函數。

例如:

from glob import glob

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

上面的內容非常糟糕 - 路徑已被硬編碼,並且只能在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上,而在其他操作系統上並不常見。 它還依賴於具有特定名稱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)



如果你關心性能,試試吧scandir。對於Python 2.x,您可能需要手動安裝它。例子:

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

當您需要掃描一個巨大的目錄時,這可以節省大量的時間,而且您不需要緩沖一個巨大的列表,只需逐個獲取。而且你也可以遞歸地做到:

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



filenames = next(os.walk(path))[2]

這將返回所有文件和目錄的列表path

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

這將只返回文件列表,而不是子目錄。




以目錄作為參數執行findfiles(),它將返回其中所有文件的列表。

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)



參考@adamk的答案,這是我的os檢測方法,以響應@Anti Earth的斜線不一致性評論

from pathlib import Path
folder = '/foo'
[f for f in Path(folder).glob('*') if f.is_file()]
[f for f in Path(folder).glob('**/*.py') if not f.is_symlink()]

我假設您只想要列表中的basenames

有關預先定義方法1的多種文件格式,請參閱此post




我將提供一個樣本一個襯管,其中可以提供源路徑和文件類型作為輸入。該代碼返回帶有csv擴展名的文件名列表。使用以防需要返回所有文件。這也將遞歸掃描子目錄。

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

根據需要修改文件擴展名和源路徑。






Related