รายการไฟล์เท่านั้นในไดเรกทอรีปัจจุบัน


225

ใน Python ฉันต้องการแสดงรายการไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันเท่านั้น ฉันไม่ต้องการให้ไฟล์ที่อยู่ในรายการจากไดเรกทอรีย่อยหรือผู้ปกครองใด ๆ

ดูเหมือนว่าจะมีวิธีแก้ไขปัญหาคล้ายกัน แต่พวกเขาดูเหมือนจะไม่ได้ผลสำหรับฉัน นี่คือข้อมูลโค้ดของฉัน:

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

สมมุติว่าฉันมี 2 ไฟล์, holygrail.py และ Tim อยู่ในไดเรกทอรีปัจจุบันของฉัน ฉันมีโฟลเดอร์ด้วยและมีสองไฟล์ - เรียกมันว่า Arthur และ Lancelot - ข้างใน เมื่อฉันเรียกใช้สคริปต์นี่คือสิ่งที่ฉันได้รับ:

holygrail.py
Tim
Arthur
Lancelot

ฉันมีความสุขกับ holygrail.py และทิม แต่ทั้งสองไฟล์ Arthur และ Lancelot ฉันไม่ต้องการแสดงรายการ

คำตอบ:


378

เพียงแค่ใช้os.listdirและแทนos.path.isfileos.walk

ตัวอย่าง:

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

แต่ระวังในขณะที่ใช้สิ่งนี้กับไดเรกทอรีอื่นเช่น

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

ซึ่งจะไม่ทำงานเพราะfไม่ใช่เส้นทางแบบเต็ม แต่สัมพันธ์กับ dir ปัจจุบัน

ดังนั้นสำหรับการกรองในไดเรกทอรีอื่นให้ทำ os.path.isfile(os.path.join(somedir, f))

(ขอบคุณเวรกรรมสำหรับคำใบ้)


3
นี่คือสิ่งที่ฉันต้องการในตอนท้าย[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
นี่คือคำตอบของเขา files = [f for f in os.listdir("/somedir") if os.path.isfile(os.path.join("/somedir", f))]'
เจฟฟ์ Luyet

64

คุณสามารถใช้os.listdirเพื่อวัตถุประสงค์นี้ ถ้าคุณต้องการเฉพาะไฟล์และไม่ไดเรกทอรีos.path.isfileคุณสามารถกรองผลการค้นหาโดยใช้

ตัวอย่าง:

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

หรือ

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
ขอบคุณที่ให้ทางออกทั่วไป (ในกรณีที่ dir ไม่ใช่ cwd)
jwg

10

os.scandir()คุณสามารถใช้ ฟังก์ชั่นใหม่ใน stdlib เริ่มต้นจาก Python 3.5

import os

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

os.listdir()เร็วกว่า การดำเนินการos.walk() os.scandir()


5

สิ่งนี้สามารถทำได้ด้วย os.walk ()

หลาม 3.5.2 ทดสอบ;

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)

ลบบรรทัด dirs.clear () และไฟล์ในโฟลเดอร์ย่อยจะถูกรวมอีกครั้ง

ปรับปรุงด้วยการอ้างอิง ;

os.walkจัดทำเอกสารที่นี่และพูดคุยเกี่ยวกับรายการสามรายการที่ถูกสร้างขึ้น

.clear () ทำเอกสารที่นี่เพื่อล้างรายการ

ดังนั้นโดยการล้างรายการที่เกี่ยวข้องจาก os.walk คุณสามารถมีผลต่อความต้องการของคุณ


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

คุณสามารถปรับปรุงรหัสนี้del dirs[:]ซึ่งจะเป็นดังต่อไปนี้

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

หรือดียิ่งขึ้นถ้าคุณสามารถชี้ os.walk ด้วยไดเรกทอรีการทำงานปัจจุบัน

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

คุณสามารถใช้โมดูล pathlib

from pathlib import Path
x = Path('./')
print(list(filter(lambda y:y.is_file(), x.iterdir())))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.