উত্তর:
আপনি ব্যবহার করতে পারেন glob
:
import glob, os
os.chdir("/mydir")
for file in glob.glob("*.txt"):
print(file)
বা সহজভাবে os.listdir
:
import os
for file in os.listdir("/mydir"):
if file.endswith(".txt"):
print(os.path.join("/mydir", file))
অথবা আপনি যদি ডিরেক্টরিটি অতিক্রম করতে চান তবে ব্যবহার করুন os.walk
:
import os
for root, dirs, files in os.walk("/mydir"):
for file in files:
if file.endswith(".txt"):
print(os.path.join(root, file))
for file in f
চেয়ে এটি লেখার চেয়ে বেশি উপযুক্ত হবে for files in f
যেহেতু ভেরিয়েবলের মধ্যে যা আছে তা একক ফাইলের নাম। এমনকি আরও ভাল পরিবর্তন করতে f
হবে files
এবং তারপরে লুপগুলি হয়ে যেতে পারে for file in files
।
file
এটি কোনও সংরক্ষিত শব্দ নয়, কেবলমাত্র একটি পূর্বনির্ধারিত ফাংশনের নাম, তাই এটি আপনার নিজের কোডে পরিবর্তনশীল নাম হিসাবে ব্যবহার করা বেশ সম্ভব। যদিও এটি সত্য যে সাধারণভাবে এটির মতো সংঘর্ষগুলি এড়ানো উচিত, file
এটি একটি বিশেষ ক্ষেত্রে কারণ এটি ব্যবহারের খুব কমই দরকার ছিল, তাই এটি প্রায়শই গাইডলাইনের ব্যতিক্রম হিসাবে বিবেচিত হয়। আপনি যদি এটি না করতে চান তবে পিইপি 8 এই জাতীয় নামের একটি একক আন্ডারস্কোর যুক্ত করার পরামর্শ দেয়, অর্থাত্ file_
, যা আপনাকে সম্মত করতে হবে তা এখনও যথেষ্ট পঠনযোগ্য।
গ্লোব ব্যবহার করুন ।
>>> import glob
>>> glob.glob('./*.txt')
['./outline.txt', './pip-log.txt', './test.txt', './testingvim.txt']
এরকম কিছু কাজ করা উচিত
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith('.txt'):
print file
root, dirs, files
পরিবর্তে আপনার ভেরিয়েবলের নামকরণের জন্য +1 r, d, f
। আরও অনেক পাঠযোগ্য able
এর মতো কিছু কাজ করবে:
>>> import os
>>> path = '/usr/share/cups/charmaps'
>>> text_files = [f for f in os.listdir(path) if f.endswith('.txt')]
>>> text_files
['euc-cn.txt', 'euc-jp.txt', 'euc-kr.txt', 'euc-tw.txt', ... 'windows-950.txt']
os.path.join
প্রতিটি উপাদান ব্যবহার করতে পারে text_files
। এটি কিছু হতে পারে text_files = [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.txt')]
।
আপনি কেবল pathlib
এস 1 ব্যবহার করতে পারেন :glob
import pathlib
list(pathlib.Path('your_directory').glob('*.txt'))
বা একটি লুপ:
for txt_file in pathlib.Path('your_directory').glob('*.txt'):
# do something with "txt_file"
আপনি যদি এটি পুনরাবৃত্তি করতে চান তবে আপনি ব্যবহার করতে পারেন .glob('**/*.txt)
1pathlib
মডিউল পাইথন 3.4 আদর্শ গ্রন্থাগার অন্তর্ভুক্ত করা হয়। তবে আপনি সেই মডিউলটির ব্যাক-পোর্টগুলি এমনকি পুরানো পাইথন সংস্করণে (যেমন ব্যবহার conda
বা ব্যবহার করতে পারেন) ইনস্টল করতে পারেন pip
: pathlib
এবং pathlib2
।
**/*.txt
পুরানো অজগর সংস্করণ দ্বারা সমর্থিত নয় o সুতরাং আমি foundfiles= subprocess.check_output("ls **/*.txt", shell=True)
for foundfile in foundfiles.splitlines():
print foundfile
pathlib
করতে পারে তা কেবল একটি প্রদর্শনী ছিল এবং আমি ইতিমধ্যে পাইথন সংস্করণ প্রয়োজনীয়তা অন্তর্ভুক্ত করেছি। :) তবে যদি আপনার দৃষ্টিভঙ্গি ইতিমধ্যে পোস্ট করা হয়নি তবে কেন এটি অন্য উত্তর হিসাবে যুক্ত করবেন না?
rglob
পুনরাবৃত্তভাবে আইটেমগুলি সন্ধান করতে চাইলে আপনি এটিও ব্যবহার করতে পারেন। উদাহরণস্বরূপ.rglob('*.txt')
import os
path = 'mypath/path'
files = os.listdir(path)
files_txt = [i for i in files if i.endswith('.txt')]
আমি ওএসওয়াক () পছন্দ করি :
import os
for root, dirs, files in os.walk(dir):
for f in files:
if os.path.splitext(f)[1] == '.txt':
fullpath = os.path.join(root, f)
print(fullpath)
বা জেনারেটর সহ:
import os
fileiter = (os.path.join(root, f)
for root, _, files in os.walk(dir)
for f in files)
txtfileiter = (f for f in fileiter if os.path.splitext(f)[1] == '.txt')
for txt in txtfileiter:
print(txt)
এখানে আরও কয়েকটি সংস্করণ রয়েছে যা কিছুটা আলাদা ফলাফল দেয়:
import glob
for f in glob.iglob("/mydir/*/*.txt"): # generator, search immediate subdirectories
print f
print glob.glob1("/mydir", "*.tx?") # literal_directory, basename_pattern
import fnmatch, os
print fnmatch.filter(os.listdir("/mydir"), "*.tx?") # include dot-files
glob1()
একটি সাহায্যকারী ফাংশন glob
মডিউল যা পাইথন ডকুমেন্টেশনে তালিকাভুক্ত নয়। উত্স ফাইলে এটি কী করে তা বর্ণনা করার জন্য কিছু ইনলাইন মন্তব্য রয়েছে, দেখুন .../Lib/glob.py
।
glob.glob1()
সর্বজনীন নয় তবে এটি পাইথন ২.৪-২..7; 3.0.3.2 এ উপলব্ধ; pypy; jython github.com/zed/test_glob1
glob
মডিউল থেকে সহজেই বের করা যেতে পারে ।
path.py অন্য বিকল্প: https://github.com/jaraco/path.py
from path import path
p = path('/path/to/the/directory')
for f in p.files(pattern='*.txt'):
print f
for f in p.walk(pattern='*.txt')
প্রতিটি সাবফোল্ডারগুলি ব্যবহার করে যাচ্ছি
list(p.glob('**/*.py'))
একটি recursive ফাংশনে os.scandir ব্যবহার করে দ্রুত পদ্ধতি। ফোল্ডার এবং সাব-ফোল্ডারগুলিতে একটি নির্দিষ্ট এক্সটেনশন সহ সমস্ত ফাইল অনুসন্ধান করে।
import os
def findFilesInFolder(path, pathList, extension, subFolders = True):
""" Recursive function to find all files of an extension type in a folder (and optionally in all subfolders too)
path: Base directory to find files
pathList: A list that stores all paths
extension: File extension to find
subFolders: Bool. If True, find files in all subfolders under path. If False, only searches files in the specified folder
"""
try: # Trapping a OSError: File permissions problem I believe
for entry in os.scandir(path):
if entry.is_file() and entry.path.endswith(extension):
pathList.append(entry.path)
elif entry.is_dir() and subFolders: # if its a directory, then repeat process as a nested function
pathList = findFilesInFolder(entry.path, pathList, extension, subFolders)
except OSError:
print('Cannot access ' + path +'. Probably a permissions error')
return pathList
dir_name = r'J:\myDirectory'
extension = ".txt"
pathList = []
pathList = findFilesInFolder(dir_name, pathList, extension, True)
আপনি যদি 10,000 টি ফাইল রয়েছে এমন ডিরেক্টরিগুলি অনুসন্ধান করে থাকেন তবে তালিকার সাথে যুক্ত করা অযোগ্য হয়ে যায়। ফলাফলগুলি 'ফলন' করা আরও ভাল সমাধান। আউটপুটটিকে একটি পান্ডাস ডেটাফ্রেমে রূপান্তর করতে আমি একটি ফাংশনও অন্তর্ভুক্ত করেছি।
import os
import re
import pandas as pd
import numpy as np
def findFilesInFolderYield(path, extension, containsTxt='', subFolders = True, excludeText = ''):
""" Recursive function to find all files of an extension type in a folder (and optionally in all subfolders too)
path: Base directory to find files
extension: File extension to find. e.g. 'txt'. Regular expression. Or 'ls\d' to match ls1, ls2, ls3 etc
containsTxt: List of Strings, only finds file if it contains this text. Ignore if '' (or blank)
subFolders: Bool. If True, find files in all subfolders under path. If False, only searches files in the specified folder
excludeText: Text string. Ignore if ''. Will exclude if text string is in path.
"""
if type(containsTxt) == str: # if a string and not in a list
containsTxt = [containsTxt]
myregexobj = re.compile('\.' + extension + '$') # Makes sure the file extension is at the end and is preceded by a .
try: # Trapping a OSError or FileNotFoundError: File permissions problem I believe
for entry in os.scandir(path):
if entry.is_file() and myregexobj.search(entry.path): #
bools = [True for txt in containsTxt if txt in entry.path and (excludeText == '' or excludeText not in entry.path)]
if len(bools)== len(containsTxt):
yield entry.stat().st_size, entry.stat().st_atime_ns, entry.stat().st_mtime_ns, entry.stat().st_ctime_ns, entry.path
elif entry.is_dir() and subFolders: # if its a directory, then repeat process as a nested function
yield from findFilesInFolderYield(entry.path, extension, containsTxt, subFolders)
except OSError as ose:
print('Cannot access ' + path +'. Probably a permissions error ', ose)
except FileNotFoundError as fnf:
print(path +' not found ', fnf)
def findFilesInFolderYieldandGetDf(path, extension, containsTxt, subFolders = True, excludeText = ''):
""" Converts returned data from findFilesInFolderYield and creates and Pandas Dataframe.
Recursive function to find all files of an extension type in a folder (and optionally in all subfolders too)
path: Base directory to find files
extension: File extension to find. e.g. 'txt'. Regular expression. Or 'ls\d' to match ls1, ls2, ls3 etc
containsTxt: List of Strings, only finds file if it contains this text. Ignore if '' (or blank)
subFolders: Bool. If True, find files in all subfolders under path. If False, only searches files in the specified folder
excludeText: Text string. Ignore if ''. Will exclude if text string is in path.
"""
fileSizes, accessTimes, modificationTimes, creationTimes , paths = zip(*findFilesInFolderYield(path, extension, containsTxt, subFolders))
df = pd.DataFrame({
'FLS_File_Size':fileSizes,
'FLS_File_Access_Date':accessTimes,
'FLS_File_Modification_Date':np.array(modificationTimes).astype('timedelta64[ns]'),
'FLS_File_Creation_Date':creationTimes,
'FLS_File_PathName':paths,
})
df['FLS_File_Modification_Date'] = pd.to_datetime(df['FLS_File_Modification_Date'],infer_datetime_format=True)
df['FLS_File_Creation_Date'] = pd.to_datetime(df['FLS_File_Creation_Date'],infer_datetime_format=True)
df['FLS_File_Access_Date'] = pd.to_datetime(df['FLS_File_Access_Date'],infer_datetime_format=True)
return df
ext = 'txt' # regular expression
containsTxt=[]
path = 'C:\myFolder'
df = findFilesInFolderYieldandGetDf(path, ext, containsTxt, subFolders = True)
পাইথনের কাছে এটি করার জন্য সমস্ত সরঞ্জাম রয়েছে:
import os
the_dir = 'the_dir_that_want_to_search_in'
all_txt_files = filter(lambda x: x.endswith('.txt'), os.listdir(the_dir))
all_txt_files = list(filter(lambda x: x.endswith('.txt'), os.listdir(the_dir)))
এটি চেষ্টা করুন এটি আপনার সমস্ত ফাইল পুনরাবৃত্তভাবে খুঁজে পাবেন:
import glob, os
os.chdir("H:\\wallpaper")# use whatever directory you want
#double\\ no single \
for file in glob.glob("**/*.txt", recursive = True):
print(file)
**
:)। কেবল পাইথন 3 এ উপলব্ধ I আমি যা পছন্দ করি না তা chdir
অংশ। ওটার দরকার নেই.
filepath = os.path.join('wallpaper')
এবং তারপরে এটি ব্যবহার করুন glob.glob(filepath+"**/*.psd", recursive = True)
, যা একই ফলাফল অর্জন করবে।
নির্দিষ্ট এক্সটেনশানযুক্ত ফাইলগুলির জন্য সম্পূর্ণ ফাইল পাথের একটি তালিকা পেতে কোনও ফোল্ডারের জন্য কোন সমাধানটি দ্রুত, কোন উপ-ডিরেক্টরি নয়, তা দেখার জন্য আমি একটি পরীক্ষা (পাইথন 3.6.4, ডাব্লু 7 এক্স 64) করেছি)
এটি সংক্ষিপ্ত করার জন্য, এই কাজটি os.listdir()
দ্রুততম এবং পরের সেরা হিসাবে 1.7x দ্রুত: os.walk()
(বিরতি দিয়ে!), 2.7x হিসাবে দ্রুত pathlib
, 3.2x দ্রুত os.scandir()
এবং 3.3x এর চেয়ে দ্রুত glob
।
দয়া করে মনে রাখবেন, যখন আপনার পুনরাবৃত্ত ফলাফলের প্রয়োজন হয় তখন সেই ফলাফলগুলি পরিবর্তন হবে। আপনি যদি নীচে একটি পদ্ধতি অনুলিপি / পেস্ট করেন তবে অনুগ্রহ করে একটি .ল্লোয়ার () যোগ করুন। .Xt অনুসন্ধানের সময় খুঁজে পাওয়া যাবে না।
import os
import pathlib
import timeit
import glob
def a():
path = pathlib.Path().cwd()
list_sqlite_files = [str(f) for f in path.glob("*.sqlite")]
def b():
path = os.getcwd()
list_sqlite_files = [f.path for f in os.scandir(path) if os.path.splitext(f)[1] == ".sqlite"]
def c():
path = os.getcwd()
list_sqlite_files = [os.path.join(path, f) for f in os.listdir(path) if f.endswith(".sqlite")]
def d():
path = os.getcwd()
os.chdir(path)
list_sqlite_files = [os.path.join(path, f) for f in glob.glob("*.sqlite")]
def e():
path = os.getcwd()
list_sqlite_files = [os.path.join(path, f) for f in glob.glob1(str(path), "*.sqlite")]
def f():
path = os.getcwd()
list_sqlite_files = []
for root, dirs, files in os.walk(path):
for file in files:
if file.endswith(".sqlite"):
list_sqlite_files.append( os.path.join(root, file) )
break
print(timeit.timeit(a, number=1000))
print(timeit.timeit(b, number=1000))
print(timeit.timeit(c, number=1000))
print(timeit.timeit(d, number=1000))
print(timeit.timeit(e, number=1000))
print(timeit.timeit(f, number=1000))
ফলাফল:
# Python 3.6.4
0.431
0.515
0.161
0.548
0.537
0.274
এই কোডটি আমার জীবনকে সহজ করে তোলে।
import os
fnames = ([file for root, dirs, files in os.walk(dir)
for file in files
if file.endswith('.txt') #or file.endswith('.png') or file.endswith('.pdf')
])
for fname in fnames: print(fname)
Fnmatch ব্যবহার করুন: https://docs.python.org/2/library/fnmatch.html
import fnmatch
import os
for file in os.listdir('.'):
if fnmatch.fnmatch(file, '*.txt'):
print file
একই ডিরেক্টরিতে "ডেটা" নামে একটি ফোল্ডার থেকে ".txt" ফাইলের নামের একটি অ্যারে পেতে আমি সাধারণত কোডের এই সাধারণ লাইনটি ব্যবহার করি:
import os
fileNames = [fileName for fileName in os.listdir("data") if fileName.endswith(".txt")]
আমি আপনাকে এফএনমেচ এবং উপরের পদ্ধতিটি ব্যবহার করার পরামর্শ দিচ্ছি । এইভাবে আপনি নীচের যে কোনওটি খুঁজে পেতে পারেন:
।
import fnmatch
import os
for file in os.listdir("/Users/Johnny/Desktop/MyTXTfolder"):
if fnmatch.fnmatch(file.upper(), '*.TXT'):
print(file)
উপ-ডিরেক্টরি সহ কার্যকরী সমাধান:
from fnmatch import filter
from functools import partial
from itertools import chain
from os import path, walk
print(*chain(*(map(partial(path.join, root), filter(filenames, "*.txt")) for root, _, filenames in walk("mydir"))))
যদি ফোল্ডারে অনেকগুলি ফাইল থাকে বা মেমোরি একটি প্রতিবন্ধক হয় তবে জেনারেটরগুলি ব্যবহার করে বিবেচনা করুন:
def yield_files_with_extensions(folder_path, file_extension):
for _, _, files in os.walk(folder_path):
for file in files:
if file.endswith(file_extension):
yield file
বিকল্প একটি: Iterate
for f in yield_files_with_extensions('.', '.txt'):
print(f)
বিকল্প বি: সমস্ত পান
files = [f for f in yield_files_with_extensions('.', '.txt')]
ঘোস্টডগের মতো একটি অনুলিপি-পেষ্টযোগ্য সমাধান:
def get_all_filepaths(root_path, ext):
"""
Search all files which have a given extension within root_path.
This ignores the case of the extension and searches subdirectories, too.
Parameters
----------
root_path : str
ext : str
Returns
-------
list of str
Examples
--------
>>> get_all_filepaths('/run', '.lock')
['/run/unattended-upgrades.lock',
'/run/mlocate.daily.lock',
'/run/xtables.lock',
'/run/mysqld/mysqld.sock.lock',
'/run/postgresql/.s.PGSQL.5432.lock',
'/run/network/.ifstate.lock',
'/run/lock/asound.state.lock']
"""
import os
all_files = []
for root, dirs, files in os.walk(root_path):
for filename in files:
if filename.lower().endswith(ext):
all_files.append(os.path.join(root, filename))
return all_files
নির্দিষ্ট এক্সটেনশন সহ ফাইলগুলি খুঁজতে পাইথন ওএস মডিউলটি ব্যবহার করুন ।
সাধারণ উদাহরণটি এখানে:
import os
# This is the path where you want to search
path = r'd:'
# this is extension you want to detect
extension = '.txt' # this can be : .jpg .png .xls .log .....
for root, dirs_list, files_list in os.walk(path):
for file_name in files_list:
if os.path.splitext(file_name)[-1] == extension:
file_name_path = os.path.join(root, file_name)
print file_name
print file_name_path # This is the full path of the filter file
অনেক ব্যবহারকারী উত্তর দিয়ে os.walk
উত্তর দিয়েছেন, যার মধ্যে সমস্ত ফাইল রয়েছে তবে সমস্ত ডিরেক্টরি এবং উপ ডিরেক্টরি এবং তাদের ফাইল অন্তর্ভুক্ত রয়েছে।
import os
def files_in_dir(path, extension=''):
"""
Generator: yields all of the files in <path> ending with
<extension>
\param path Absolute or relative path to inspect,
\param extension [optional] Only yield files matching this,
\yield [filenames]
"""
for _, dirs, files in os.walk(path):
dirs[:] = [] # do not recurse directories.
yield from [f for f in files if f.endswith(extension)]
# Example: print all the .py files in './python'
for filename in files_in_dir('./python', '*.py'):
print("-", filename)
বা এমন একের জন্য যেখানে আপনার জেনারেটরের দরকার নেই:
path, ext = "./python", ext = ".py"
for _, _, dirfiles in os.walk(path):
matches = (f for f in dirfiles if f.endswith(ext))
break
for filename in matches:
print("-", filename)
আপনি যদি অন্য কোনও কিছুর জন্য ম্যাচ ব্যবহার করতে চলেছেন তবে আপনি এটিকে জেনারেটর এক্সপ্রেশন না করে তালিকা তৈরি করতে চাইতে পারেন:
matches = [f for f in dirfiles if f.endswith(ext)]
for
লুপ ব্যবহার করে একটি সহজ পদ্ধতি :
import os
dir = ["e","x","e"]
p = os.listdir('E:') #path
for n in range(len(p)):
name = p[n]
myfile = [name[-3],name[-2],name[-1]] #for .txt
if myfile == dir :
print(name)
else:
print("nops")
যদিও এটি আরও সাধারণীকরণ করা যায়।