Pertanyaan Bagaimana cara saya mendaftar semua file direktori?


Bagaimana saya bisa daftar semua file dari direktori dengan Python dan menambahkannya ke list?


2812
2017-07-08 19:31


asal


Jawaban:


os.listdir() Anda akan mendapatkan semua yang ada di direktori - file dan direktori.

jika kamu mau hanya file, Anda bisa menyaring ini menggunakan os.path:

from os import listdir
from os.path import isfile, join
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]

atau bisa digunakan os.walk() yang akan menghasilkan dua daftar untuk setiap direktori yang dikunjungi - dibagi menjadi file dan dirs untuk Anda. Jika Anda hanya ingin direktori teratas, Anda dapat mematahkannya saat pertama kali menghasilkan

from os import walk

f = []
for (dirpath, dirnames, filenames) in walk(mypath):
    f.extend(filenames)
    break

Dan terakhir, seperti yang ditunjukkan contoh, menambahkan satu daftar ke daftar lainnya yang dapat Anda gunakan .extend() atau

>>> q = [1, 2, 3]
>>> w = [4, 5, 6]
>>> q = q + w
>>> q
[1, 2, 3, 4, 5, 6]

Secara pribadi, saya lebih suka .extend()


2813
2017-07-08 21:01



Saya lebih suka menggunakan glob modul, karena pencocokan pola dan ekspansi.

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

Ini akan mengembalikan daftar dengan file yang ditanyai:

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

1138
2017-07-09 18:13



import os
os.listdir("somedirectory")

akan mengembalikan daftar semua file dan direktori di "somedirectory".


518
2017-07-08 19:35



Dapatkan daftar file dengan Python 2 dan 3


Saya juga membuat video singkat di sini:  Python: bagaimana cara mendapatkan daftar file di direktori


os.listdir ()

atau ..... panas untuk mendapatkan semua file (dan direktori) dalam direktori saat ini (Python 3)

Cara termudah untuk memiliki file di direktori saat ini dengan Python 3 adalah ini. Ini sangat sederhana; menggunakan os modul dan fungsi listdir () dan Anda akan memiliki file di direktori itu (dan akhirnya folder yang ada di direktori, tetapi Anda tidak akan memiliki file di subdirektori, untuk itu Anda dapat menggunakan walk - saya akan membicarakannya kemudian).

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

Menggunakan glob

Saya menemukan glob lebih mudah untuk memilih file dengan tipe yang sama atau dengan sesuatu yang sama. Lihatlah contoh berikut:

import glob

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

Menggunakan pemahaman daftar

import glob

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

Dapatkan nama path lengkap dengan os.path.abspath

Seperti yang Anda perhatikan, Anda tidak memiliki path lengkap dari file dalam kode di atas. Jika Anda perlu memiliki jalur absolut, Anda dapat menggunakan fungsi lain dari os.path modul yang disebut _getfullpathname, meletakkan file yang Anda dapatkan os.listdir() sebagai sebuah argumen. Ada cara lain untuk memiliki jalur lengkap, karena kami akan memeriksa nanti (saya mengganti, seperti yang disarankan oleh mexmex, _getfullpathname dengan abspath).

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

Dapatkan nama path lengkap dari jenis file ke semua subdirektori dengan berjalan

Saya menemukan ini sangat berguna untuk menemukan barang di banyak direktori, dan itu membantu saya menemukan file yang tidak saya ingat namanya:

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 (): dapatkan file di direktori saat ini (Python 2)

Dalam Python 2 Anda, jika Anda ingin daftar file dalam direktori saat ini, Anda harus memberikan argumen sebagai '.' atau os.getcwd () dalam metode os.listdir.

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

Untuk naik di pohon direktori

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

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

Dapatkan file: os.listdir () di direktori tertentu (Python 2 dan 3)

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

Dapatkan file dari subdirektori tertentu dengan os.listdir ()

import os

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

os.walk ('.') - direktori saat ini

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

modul glob - semua file

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

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

selanjutnya (os.walk ('.')) dan 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

selanjutnya (os.walk ('F: \') - dapatkan jalur lengkap - daftar pemahaman

>>> [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 - dapatkan path lengkap - semua file dalam sub dirs

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 () - dapatkan hanya file txt

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

glob - dapatkan hanya file txt

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

Menggunakan glob untuk mendapatkan path lengkap dari file

Jika saya perlu path absolut dari file:

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

Penggunaan glob lainnya

Jika saya ingin semua file di direktori:

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

Menggunakan os.path.isfile untuk menghindari direktori dalam daftar

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

Menggunakan pathlib dari (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

Jika Anda ingin menggunakan pemahaman daftar

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

Dapatkan semua dan hanya file dengan 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']

Dapatkan hanya file dengan berikutnya dan berjalan di direktori

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

Dapatkan hanya direktori dengan berikutnya dan berjalan di direktori

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

Dapatkan semua nama subdir dengan berjalan

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

os.scandir () dari Python 3.5 pada

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

Ex. 1: Berapa banyak file yang ada di subdirektori?

Dalam contoh ini, kita mencari jumlah file yang termasuk dalam semua direktori dan subdirektorinya.

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'

Ex.2: Bagaimana cara menyalin semua file dari direktori ke direktori lain?

Skrip untuk membuat pesanan di komputer Anda menemukan semua file tipe (default: pptx) dan menyalinnya di folder baru.

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

Ex. 3: Cara mendapatkan semua file dalam file txt

Jika Anda ingin membuat file txt dengan semua nama file:

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

327
2018-01-03 15:36



Solusi satu baris untuk mendapatkan hanya daftar file (tidak ada subdirektori):

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

atau nama path absolut:

paths = [os.path.join(path,fn) for fn in next(os.walk(path))[2]]

144
2018-01-18 17:42



Mendapatkan Jalur File Lengkap Dari Direktori dan Semua Subdirektorinya

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

  • Jalur yang saya sediakan dalam fungsi di atas berisi 3 file — dua di antaranya di direktori root, dan lainnya di subfolder bernama "SUBFOLDER." Sekarang Anda dapat melakukan hal-hal seperti:
  • print full_file_paths yang akan mencetak daftar:

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

Jika Anda mau, Anda dapat membuka dan membaca konten, atau hanya fokus pada file dengan ekstensi ".dat" seperti pada kode di bawah ini:

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

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


110
2017-10-11 00:55



Sejak versi 3.4 ada builtin iterator untuk ini yang jauh lebih efisien daripada os.listdir():

pathlib: Baru di versi 3.4.

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

Menurut PEP 428, tujuan dari pathlib perpustakaan adalah untuk menyediakan hirarki kelas sederhana untuk menangani jalur sistem file dan operasi umum yang dilakukan pengguna di atasnya.

os.scandir(): Baru di versi 3.5.

>>> import os
>>> [entry for entry in os.scandir('.') if entry.is_file()]

Perhatikan itu os.walk() menggunakan os.scandir() dari pada os.listdir() dari versi 3.5, dan kecepatannya meningkat 2-20 kali sesuai PEP 471.

Biarkan saya juga merekomendasikan membaca komentar ShadowRanger di bawah ini.


57
2018-06-18 20:58



saya sangat suka Jawaban adamk, menyarankan yang Anda gunakan glob(), dari modul dengan nama yang sama. Ini memungkinkan Anda untuk memiliki pola yang cocok *s.

Tapi seperti yang dikatakan orang lain di komentar, glob() bisa tersandung karena arah slash yang tidak konsisten. Untuk membantu dengan itu, saya sarankan Anda menggunakan join() dan expanduser() fungsi dalam os.path modul, dan mungkin getcwd() berfungsi dalam os modul, juga.

Sebagai contoh:

from glob import glob

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

Di atas mengerikan - jalan telah hardcoded dan hanya akan bekerja pada Windows antara nama drive dan \s yang hardcoded ke jalan.

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

Cara di atas berfungsi lebih baik, tetapi bergantung pada nama folder Usersyang sering ditemukan di Windows dan tidak begitu sering ditemukan di OS lain. Itu juga bergantung pada pengguna yang memiliki nama tertentu, 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'))

Ini bekerja sempurna di semua platform.

Contoh bagus lainnya yang bekerja sempurna di seluruh platform dan melakukan sesuatu yang sedikit berbeda:

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

Semoga contoh ini membantu Anda melihat kekuatan beberapa fungsi yang dapat Anda temukan di modul pustaka Python standar.


45
2017-07-09 11:43



def list_files(path):
    # returns a list of names (with extension, without full path) of all files 
    # in folder path
    files = []
    for name in os.listdir(path):
        if os.path.isfile(os.path.join(path, name)):
            files.append(name)
    return files 

33
2018-06-10 16:16