පයිතන් හි මාර්ගයකින් දිගුවකින් තොරව ගොනු නාමය ලබා ගන්නේ කෙසේද?
උදාහරණයක් ලෙස, මට තිබුනේ නම් "/path/to/some/file.txt"
, මට අවශ්ය වනු ඇත "file"
.
පයිතන් හි මාර්ගයකින් දිගුවකින් තොරව ගොනු නාමය ලබා ගන්නේ කෙසේද?
උදාහරණයක් ලෙස, මට තිබුනේ නම් "/path/to/some/file.txt"
, මට අවශ්ය වනු ඇත "file"
.
Answers:
දිගුවකින් තොරව ගොනුවේ නම ලබා ගැනීම:
import os
print(os.path.splitext("/path/to/some/file.txt")[0])
මුද්රණ:
/path/to/some/file
සඳහා ලියකියවිලිos.path.splitext
.
වැදගත් සටහන: ගොනු නාමයට බහු තිත් තිබේ නම්, අවසන් එක ඉවත් කිරීමෙන් පසුව දිගුව පමණි. උදාහරණයක් වශයෙන්:
import os
print(os.path.splitext("/path/to/some/file.txt.zip.asc")[0])
මුද්රණ:
/path/to/some/file.txt.zip
ඔබට එම නඩුව හැසිරවීමට අවශ්ය නම් පහත වෙනත් පිළිතුරු බලන්න.
splitext('kitty.jpg.zip')
ලබා දෙයි ('kitty.jpg', '.zip')
).
splitext(basename('/some/path/to/file.txt'))[0]
(මම සැමවිටම කරන බව පෙනේ)
ඔබට මෙය තනිවම කළ හැකිය:
>>> import os
>>> base=os.path.basename('/root/dir/sub/file.ext')
>>> base
'file.ext'
>>> os.path.splitext(base)
('file', '.ext')
>>> os.path.splitext(base)[0]
'file'
වැදගත් සටහන: .
ගොනු නාමයේ එකකට වඩා තිබේ නම්, අවසාන එක පමණක් ඉවත් කරනු ලැබේ. උදාහරණයක් වශයෙන්:
/root/dir/sub/file.ext.zip -> file.ext
/root/dir/sub/file.ext.tar.gz -> file.ext.tar
එය ආමන්ත්රණය කරන වෙනත් පිළිතුරු සඳහා පහත බලන්න.
pathlib
පයිතන් 3.4+ හි භාවිතා කිරීම
from pathlib import Path
Path('/root/dir/sub/file.ext').stem
නැවත පැමිණේ
'file'
os.path
විසඳුම් මෙන් , මෙය එක් දිගුවක් පමණක් ඉවත් කරනු ඇති බව සලකන්න (හෝ suffix
, එය pathlib
හඳුන්වන පරිදි). Path('a.b.c').stem == 'a.b'
Path(Path('a.b.c').stem).stem
.with_suffix('')
යන්නට මාර්ගයයි. ඔබට බොහෝ විට ලූප වීමට අවශ්ය වනු ඇත p.suffix == ''
.
pathlib.Path('backup.tar.gz').stem
-> 'backup.tar
නමුත් අපේක්ෂිතbackup
>>> print(os.path.splitext(os.path.basename("/path/to/file/hemanth.txt"))[0])
hemanth
`
කේතය පෙන්වීම සඳහා භාවිතා කළ හැකි අතර, "/somepath/hermanth.txt" මාර්ග උදාහරණයක් ලෙස දැක්විය හැකිය.
os.path.basename
අවශ්ය නොවන බව සලකන්න . os.path.basename
භාවිතා කළ යුත්තේ ගොනු මාර්ගයෙන් ගොනු නාමය ලබා ගැනීමට පමණි.
පයිතන් 3.4+ හි ඔබට pathlib
විසඳුම භාවිතා කළ හැකිය
from pathlib import Path
print(Path(your_path).resolve().stem)
resolve()
වන්නේ බහු තිත් ගැටළුව සමඟ කටයුතු කිරීමට උපකාර කිරීමයි. මාර්ගය './foo.tar.gz' නම් දර්ශකය භාවිතා කිරීම පිළිබඳ පහත පිළිතුර ක්රියාත්මක නොවනු ඇත
https://docs.python.org/3/library/os.path.html
පයිතන් 3 පාත්ලිබ් හි "පාත්ලිබ් මොඩියුලය ඉහළ මට්ටමේ මාර්ග වස්තු ඉදිරිපත් කරයි." නිසා,
>>> from pathlib import Path
>>> p = Path("/a/b/c.txt")
>>> print(p.with_suffix(''))
\a\b\c
>>> print(p.stem)
c
ඔබට ගොනුව වෙත යන මාර්ගය තබාගෙන දිගුව ඉවත් කිරීමට අවශ්ය නම්
>>> file = '/root/dir/sub.exten/file.data.1.2.dat'
>>> print ('.').join(file.split('.')[:-1])
/root/dir/sub.exten/file.data.1.2
'/root/dir/sub.exten/file.data.1.2.dat'.rsplit('.', 1)
දිගුවේ බහු තිත් තිබේ නම් os.path.splitext () ක්රියා නොකරයි .
උදාහරණයක් ලෙස, images.tar.gz
>>> import os
>>> file_path = '/home/dc/images.tar.gz'
>>> file_name = os.path.basename(file_path)
>>> print os.path.splitext(file_name)[0]
images.tar
ඔබට පළමු තිතේ දර්ශකය මූලික නාමයෙන් සොයා ගත හැකි අතර පසුව දිගුවකින් තොරව ගොනු නාමය ලබා ගැනීම සඳහා මූලික නම කපා දමන්න.
>>> import os
>>> file_path = '/home/dc/images.tar.gz'
>>> file_name = os.path.basename(file_path)
>>> index_of_dot = file_name.index('.')
>>> file_name_without_extension = file_name[:index_of_dot]
>>> print file_name_without_extension
images
'haystack'.index('needle')
ඉඳිකටුවක් (ඉහත අවස්ථාවෙහිදී තිත, .
) පිදුරු මල්ලේ සොයාගත නොහැකි නම් ValueError ව්යතිරේකයක් විසි කරන බව සලකන්න . කිසිදු දිගුවක් නොමැති ලිපිගොනු ද පවතී.
නමුත් මම OS ආනයනය කරන විට පවා මට එය path.basename ලෙස හැඳින්විය නොහැක. එය කෙළින්ම බේස් නාමය ලෙස හැඳින්විය හැකිද?
import os
, ඉන්පසු භාවිතා කරන්න os.path.basename
import
ing os
යන්නෙන් අදහස් os.foo
නොකර ඔබට භාවිතා කළ හැකිය os
.
from os import foo
.
os
මොඩියුලයේ සාමාජිකයෙකු සිටී නම් ඔබට එහි සම්මත නොවන අනුවාදයක් ඇත foo
.
path
, හෝ walk
).
අරාව සුචිගත කිරීමේ අවශ්යතාවයකින් තොරව os.path.splitext භාවිතා කිරීම සඳහා මම විචල්යතාවයක් දක්වනු ඇතැයි සිතුවෙමි .
ශ්රිතය සැමවිටම (root, ext)
යුගලයක් ලබා දෙන බැවින් එය භාවිතා කිරීම ආරක්ෂිත වේ:
root, ext = os.path.splitext(path)
උදාහරණයක්:
>>> import os
>>> path = 'my_text_file.txt'
>>> root, ext = os.path.splitext(path)
>>> root
'my_text_file'
>>> ext
'.txt'
අනෙක් ක්රම බහු දිග ඉවත් නොකරයි. සමහරුන්ට දිගු නොමැති ගොනු නාමයන් සමඟ ද ගැටලු ඇත. මෙම ස්නිපටය පයිතන් 2 සහ 3 යන දෙඅංශයෙන්ම ක්රියා කරයි. එය පාදමේ නම මාර්ගයෙන් උදුරා ගනී, තිත් වල අගය බෙදයි, සහ ගොනු නාමයේ ආරම්භක කොටස වන පළමු එක ලබා දෙයි.
import os
def get_filename_without_extension(file_path):
file_basename = os.path.basename(file_path)
filename_without_extension = file_basename.split('.')[0]
return filename_without_extension
ක්රියාත්මක කිරීමට උදාහරණ කිහිපයක් මෙන්න:
example_paths = [
"FileName",
"./FileName",
"../../FileName",
"FileName.txt",
"./FileName.txt.zip.asc",
"/path/to/some/FileName",
"/path/to/some/FileName.txt",
"/path/to/some/FileName.txt.zip.asc"
]
for example_path in example_paths:
print(get_filename_without_extension(example_path))
සෑම අවස්ථාවකම, මුද්රණය කළ අගය:
FileName
Path('/path/to/file.txt').stem
. (1,23μs vs 8.39μs)
import os
filename = C:\\Users\\Public\\Videos\\Sample Videos\\wildlife.wmv
(C: ers පරිශීලකයින් \ පොදු \ වීඩියෝ \ නියැදි වීඩියෝ \ වනජීවී) filename
නොමැතිව මෙය නැවත ලබා දෙයිextension
temp = os.path.splitext(filename)[0]
දැන් ඔබට filename
තාවකාලිකව ලබා ගත හැකිය
os.path.basename(temp) #this returns just the filename (wildlife)
බහු දිගුව දැනුවත් කිරීමේ ක්රියා පටිපාටියක්. වැඩ str
සහ unicode
මාර්ග සඳහා. පයිතන් 2 සහ 3 හි ක්රියා කරයි.
import os
def file_base_name(file_name):
if '.' in file_name:
separator_index = file_name.index('.')
base_name = file_name[:separator_index]
return base_name
else:
return file_name
def path_base_name(path):
file_name = os.path.basename(path)
return file_base_name(file_name)
හැසිරීම:
>>> path_base_name('file')
'file'
>>> path_base_name(u'file')
u'file'
>>> path_base_name('file.txt')
'file'
>>> path_base_name(u'file.txt')
u'file'
>>> path_base_name('file.tar.gz')
'file'
>>> path_base_name('file.a.b.c.d.e.f.g')
'file'
>>> path_base_name('relative/path/file.ext')
'file'
>>> path_base_name('/absolute/path/file.ext')
'file'
>>> path_base_name('Relative\\Windows\\Path\\file.txt')
'file'
>>> path_base_name('C:\\Absolute\\Windows\\Path\\file.txt')
'file'
>>> path_base_name('/path with spaces/file.ext')
'file'
>>> path_base_name('C:\\Windows Path With Spaces\\file.txt')
'file'
>>> path_base_name('some/path/file name with spaces.tar.gz.zip.rar.7z')
'file name with spaces'
import os
path = "a/b/c/abc.txt"
print os.path.splitext(os.path.basename(path))[0]
පහසුව සඳහා, ක්රම දෙක ඔතා සරල ශ්රිතයක් os.path
:
def filename(path):
"""Return file name without extension from path.
See https://docs.python.org/3/library/os.path.html
"""
import os.path
b = os.path.split(path)[1] # path, *filename*
f = os.path.splitext(b)[0] # *file*, ext
#print(path, b, f)
return f
පයිතන් 3.5 සමඟ පරීක්ෂා කර ඇත.
මෙය විසඳීමට ඇති පහසුම ක්රමය නම්
import ntpath
print('Base name is ',ntpath.basename('/path/to/the/file/'))
මෙය ඔබගේ කාලය සහ ගණනය කිරීමේ පිරිවැය ඉතිරි කරයි.
ඉතා ඉතා සරලව වෙනත් මොඩියුල නොමැත !!!
import os
p = r"C:\Users\bilal\Documents\face Recognition python\imgs\northon.jpg"
# Get the filename only from the initial file path.
filename = os.path.basename(p)
# Use splitext() to get filename and extension separately.
(file, ext) = os.path.splitext(filename)
# Print outcome.
print("Filename without extension =", file)
print("Extension =", ext)
මම එතරම් අමාරුවෙන් බැලුවේ නැත, නමුත් මෙම ගැටළුව සඳහා රීජෙක්ස් භාවිතා කළ කිසිවෙකු මා දුටුවේ නැත.
මම ප්රශ්නය අර්ථකථනය කළේ “මාර්ගයක් ලබා දී, දිගුවකින් තොරව මූලික නම ආපසු එවන්න” යනුවෙනි.
උදා
"path/to/file.json"
=> "file"
"path/to/my.file.json"
=> "my.file"
පයිතන් 2.7 හි, අප තවමත් නොමැතිව ජීවත් වන pathlib
...
def get_file_name_prefix(file_path):
basename = os.path.basename(file_path)
file_name_prefix_match = re.compile(r"^(?P<file_name_pre fix>.*)\..*$").match(basename)
if file_name_prefix_match is None:
return file_name
else:
return file_name_prefix_match.group("file_name_prefix")
get_file_name_prefix("path/to/file.json")
>> file
get_file_name_prefix("path/to/my.file.json")
>> my.file
get_file_name_prefix("path/to/no_extension")
>> no_extension
ගොනු නාමය උකහා ගැනීම සඳහා ( https://stackoverflow.com/a/424006/1250044 ) අපට මෙහි පෙනෙන පරිදි සරල split
/ pop
මැජික් කිහිපයක් කළ හැකිය ( කවුළු සහ පොසික්ස් වෙනස්කම් වලට ගරු කරමින්).
def getFileNameWithoutExtension(path):
return path.split('\\').pop().split('/').pop().rsplit('.', 1)[0]
getFileNameWithoutExtension('/path/to/file-0.0.1.ext')
# => file-0.0.1
getFileNameWithoutExtension('\\path\\to\\file-0.0.1.ext')
# => file-0.0.1
import os
list = []
def getFileName( path ):
for file in os.listdir(path):
#print file
try:
base=os.path.basename(file)
splitbase=os.path.splitext(base)
ext = os.path.splitext(base)[1]
if(ext):
list.append(base)
else:
newpath = path+"/"+file
#print path
getFileName(newpath)
except:
pass
return list
getFileName("/home/weexcel-java3/Desktop/backup")
print list
ආනයන os ගොනු නාමය, file_extension = os.path.splitext ('/ d1 / d2 / example.cs') ගොනු නාමය '/ d1 / d2 / උදාහරණය' file_extension යනු '.cs'