Liệt kê các tệp CHỈ trong thư mục hiện tại


225

Trong Python, tôi chỉ muốn liệt kê tất cả các tệp trong thư mục hiện tại CHỈ. Tôi không muốn các tập tin được liệt kê từ bất kỳ thư mục phụ hoặc phụ huynh.

Có vẻ như có những giải pháp tương tự ngoài kia, nhưng dường như chúng không hiệu quả với tôi. Đây là đoạn mã của tôi:

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

Giả sử tôi có 2 tệp, Holygrail.py và Tim trong thư mục hiện tại của tôi. Tôi cũng có một thư mục và nó chứa hai tệp - hãy gọi chúng là Arthur và Lancelot - bên trong nó. Khi tôi chạy tập lệnh, đây là những gì tôi nhận được:

holygrail.py
Tim
Arthur
Lancelot

Tôi hài lòng với Holygrail.py và Tim. Nhưng hai tập tin, Arthur và Lancelot, tôi không muốn liệt kê.

Câu trả lời:


378

Chỉ cần sử dụng os.listdiros.path.isfilethay vì os.walk.

Thí dụ:

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

Nhưng hãy cẩn thận trong khi áp dụng điều này cho thư mục khác, như

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

mà sẽ không hoạt động vì fkhông phải là một đường dẫn đầy đủ mà liên quan đến thư mục hiện tại.

Do đó, để lọc trên thư mục khác, hãy làm os.path.isfile(os.path.join(somedir, f))

(Cảm ơn Nhân quả cho gợi ý)


3
Đây là những gì tôi cần cuối cùng[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
Đây là câu trả lời của anh ấy: files = [f for f in os.listdir("/somedir") if os.path.isfile(os.path.join("/somedir", f))]'
Jeff Luyet

64

Bạn có thể sử dụng os.listdircho mục đích này. Nếu bạn chỉ muốn tệp và không phải thư mục , bạn có thể lọc kết quả bằng cách sử dụng os.path.isfile.

thí dụ:

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

hoặc là

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.

20
import os

destdir = '/var/tmp/testdir'

files = [ f for f in os.listdir(destdir) if os.path.isfile(os.path.join(destdir,f)) ]

3
Cảm ơn đã đưa ra giải pháp chung (trong trường hợp dir không phải là cwd).
jwg

10

Bạn có thể sử dụng os.scandir(). Hàm mới trong stdlib bắt đầu từ Python 3.5.

import os

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

Nhanh hơn os.listdir(). os.walk() thực hiện os.scandir() .


5

điều này có thể được thực hiện với os.walk ()

trăn 3.5.2 đã thử nghiệm;

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)

xóa dòng dirs.clear () và các tệp trong thư mục con được bao gồm lại.

cập nhật với các tài liệu tham khảo ;

os.walk tài liệu ở đây và nói về danh sách ba được tạo và hiệu ứng topdown.

.clear () được ghi lại ở đây để làm trống danh sách

vì vậy bằng cách xóa danh sách liên quan từ os.walk, bạn có thể ảnh hưởng đến kết quả của nó theo nhu cầu của bạn.


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

Bạn có thể cải thiện mã del dirs[:]này sẽ như sau.

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

Hoặc thậm chí tốt hơn nếu bạn có thể trỏ os.walk với thư mục làm việc hiện tại.

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


1

Bạn có thể sử dụng mô-đun pathlib.

from pathlib import Path
x = Path('./')
print(list(filter(lambda y:y.is_file(), x.iterdir())))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.