বর্তমান ডিরেক্টরিতে কেবল ফাইলগুলি তালিকাভুক্ত করুন


225

পাইথনে, আমি কেবলমাত্র বর্তমান ডিরেক্টরিতে সমস্ত ফাইল তালিকাবদ্ধ করতে চাই। আমি কোনও উপ ডিরেক্টরি বা পিতামাতাদের তালিকাভুক্ত ফাইল চাই না।

সেখানে একই ধরণের সমাধান রয়েছে বলে মনে হয় তবে তারা আমার পক্ষে কাজ করে বলে মনে হয় না। আমার কোড স্নিপেট এখানে:

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

ধরা যাক আমার বর্তমান ডিরেক্টরিতে আমার কাছে দুটি ফাইল, হলিগ্রিল.পি এবং টিম রয়েছে। আমার পাশাপাশি একটি ফোল্ডার রয়েছে এবং এতে দুটি ফাইল রয়েছে - আসুন এটি আর্থার এবং ল্যানস্লট - এর অভ্যন্তরে কল করুন। আমি যখন স্ক্রিপ্টটি চালাচ্ছি, এটি আমি পাই:

holygrail.py
Tim
Arthur
Lancelot

আমি পবিত্রগ্রিল.পি এবং টিম নিয়ে খুশি। তবে আর্থার এবং ল্যানস্লট দুটি ফাইলই আমি তালিকাবদ্ধ থাকতে চাই না।

উত্তর:


378

শুধু ব্যবহার করুন os.listdirএবং os.path.isfileপরিবর্তেos.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 একটি পূর্ণ পথ নয় তবে বর্তমান দিরের সাথে আপেক্ষিক।

সুতরাং, অন্য ডিরেক্টরিতে ফিল্টারিংয়ের জন্য, করুন 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))]
সিটিএনরম্যান

2
এটি তার উত্তর: files = [f for f in os.listdir("/somedir") if os.path.isfile(os.path.join("/somedir", f))]'
জেফ লুয়েট

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
সাধারণ সমাধান দেওয়ার জন্য ধন্যবাদ (যে ক্ষেত্রে স্যার সিডব্লিউড নয়))
jwg

10

আপনি ব্যবহার করতে পারেন os.scandir()। Stdlib এ নতুন ফাংশন পাইথন 3.5 থেকে শুরু হয়।

import os

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

আরও দ্রুত os.listdir()os.walk() প্রয়োগ os.scandir()


5

এটি ওএসওয়াক দিয়ে করা যেতে পারে ()

অজগর 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)

ডায়ারস ক্লেয়ার () লাইনটি সরিয়ে ফেলুন এবং সাব ফোল্ডারে থাকা ফাইলগুলি আবার অন্তর্ভুক্ত করা হবে।

রেফারেন্স সহ আপডেট করুন ;

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

আপনি পাথলিব মডিউলটি ব্যবহার করতে পারেন।

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.