Daftar file HANYA dalam direktori saat ini

225

Dalam Python, saya hanya ingin mendaftar semua file di direktori saat ini saja. Saya tidak ingin file terdaftar dari sub direktori atau orang tua.

Tampaknya ada solusi serupa di luar sana, tetapi mereka tampaknya tidak bekerja untuk saya. Berikut cuplikan kode saya:

import os
for subdir, dirs, files in os.walk('./'):
    for file in files:
      do some stuff
      print file

Misalkan saya memiliki 2 file, holygrail.py dan Tim di dalam direktori saya saat ini. Saya memiliki folder juga dan itu berisi dua file - sebut saja Arthur dan Lancelot - di dalamnya. Ketika saya menjalankan skrip, inilah yang saya dapatkan:

holygrail.py
Tim
Arthur
Lancelot

Saya senang dengan holygrail.py dan Tim. Tapi dua file, Arthur dan Lancelot, saya tidak mau terdaftar.

slam_duncan
sumber

Jawaban:

378

Cukup gunakan os.listdirdan os.path.isfilebukannya os.walk.

Contoh:

import os
files = [f for f in os.listdir('.') if os.path.isfile(f)]
for f in files:
    # do something

Tapi hati-hati saat menerapkan ini ke direktori lain, seperti

files = [f for f in os.listdir(somedir) if os.path.isfile(f)].

yang tidak akan bekerja karena fbukan path lengkap tetapi relatif terhadap dir saat ini.

Karena itu, untuk memfilter pada direktori lain, lakukan os.path.isfile(os.path.join(somedir, f))

(Terima kasih Kausalitas untuk petunjuknya)

kemalasan
sumber
3
Inilah yang saya butuhkan pada akhirnya[os.path.join(path_base,f) for f in os.listdir(path_base) if os.path.isfile(os.path.join(path_base,f))]
citynorman
2
Ini jawabannya: files = [f for f in os.listdir("/somedir") if os.path.isfile(os.path.join("/somedir", f))]'
Jeff Luyet
64

Anda dapat menggunakan os.listdiruntuk tujuan ini. Jika Anda hanya menginginkan file dan bukan direktori , Anda dapat memfilter hasilnya menggunakan os.path.isfile.

contoh:

files = os.listdir(os.curdir)  #files and directories

atau

files = filter(os.path.isfile, os.listdir( os.curdir ) )  # files only
files = [ f for f in os.listdir( os.curdir ) if os.path.isfile(f) ] #list comprehension version.
mgilson
sumber
20
import os

destdir = '/var/tmp/testdir'

files = [ f for f in os.listdir(destdir) if os.path.isfile(os.path.join(destdir,f)) ]
Nasimuddin Ansari
sumber
3
Terima kasih telah memberikan solusi umum (dalam kasus di mana dir bukan cwd).
jwg
10

Anda bisa menggunakannya os.scandir(). Fungsi baru di stdlib dimulai dari Python 3.5.

import os

for entry in os.scandir('.'):
    if entry.is_file():
        print(entry.name)

Lebih cepat dari os.listdir(). os.walk() mengimplementasikan os.scandir() .

prasastoadi
sumber
5

ini bisa dilakukan dengan os.walk ()

python 3.5.2 diuji;

import os
for root, dirs, files in os.walk('.', topdown=True):
    dirs.clear() #with topdown true, this will prevent walk from going into subs
    for file in files:
      #do some stuff
      print(file)

hapus baris dirs.clear () dan file-file dalam sub folder dimasukkan lagi.

perbarui dengan referensi ;

os.walkan didokumentasikan di sini dan berbicara tentang daftar tiga yang dibuat dan efek topdown.

.clear () didokumentasikan di sini untuk mengosongkan daftar

jadi dengan menghapus daftar yang relevan dari os.walk Anda dapat mempengaruhi hasilnya untuk kebutuhan Anda.

2114L3
sumber
4
import os
for subdir, dirs, files in os.walk('./'):
    for file in files:
      do some stuff
      print file

Anda dapat meningkatkan kode ini dengan del dirs[:]yang akan seperti berikut.

import os
for subdir, dirs, files in os.walk('./'):
    del dirs[:]
    for file in files:
      do some stuff
      print file

Atau bahkan lebih baik jika Anda bisa mengarahkan os.walk dengan direktori kerja saat ini.

import os
cwd = os.getcwd()
for subdir, dirs, files in os.walk(cwd, topdown=True):
    del dirs[:]  # remove the sub directories.
    for file in files:
      do some stuff
      print file
Ozgur Oz
sumber
3

alih-alih os.walk, gunakan sajaos.listdir

Inbar Rose
sumber
1

Anda dapat menggunakan modul pathlib.

from pathlib import Path
x = Path('./')
print(list(filter(lambda y:y.is_file(), x.iterdir())))
Pygirl
sumber