පයිතන් හි මාර්ගයකින් දිගුවකින් තොරව ගොනු නාමය ලබා ගන්නේ කෙසේද?


1043

පයිතන් හි මාර්ගයකින් දිගුවකින් තොරව ගොනු නාමය ලබා ගන්නේ කෙසේද?

උදාහරණයක් ලෙස, මට තිබුනේ නම් "/path/to/some/file.txt", මට අවශ්‍ය වනු ඇත "file".

Answers:


1353

දිගුවකින් තොරව ගොනුවේ නම ලබා ගැනීම:

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

ඔබට එම නඩුව හැසිරවීමට අවශ්‍ය නම් පහත වෙනත් පිළිතුරු බලන්න.


13
මෙය ප්‍රමාණවත් තරම් පොදු මෙහෙයුමක් නම්, සමහර විට එය තමන්ගේම නිල විධානයක් ලැබිය යුතුද? Os.path.splitext (os.path.basename (path_to_file)) වෙනුවට os.path.filename (path_to_file) වැනි දෙයක් [0]
Fnord

20
ගොනු නාමයේ බහු තිත් තිබේ නම් කුමක් කළ යුතුද?
matteok

104
මැටෙයොක් හා සමාන පුදුමයක් ඇති ඕනෑම කෙනෙකුට, බහුවිධ තිත් තිබේ නම්, අන්තිම එකෙහි බෙදීම් බෙදී යයි (එසේ splitext('kitty.jpg.zip')ලබා දෙයි ('kitty.jpg', '.zip')).
චක්

54
මෙම කේතය ගොනු නාමය පමණක් නොව සම්පූර්ණ ගොනු මාර්ගය (දිගුවකින් තොරව) ලබා දෙන බව සලකන්න .
අරන්-ෆේ

3
ඔව්, එබැවින් ඔබට කළ යුතුව ඇත splitext(basename('/some/path/to/file.txt'))[0](මම සැමවිටම කරන බව පෙනේ)
CpILL

564

ඔබට මෙය තනිවම කළ හැකිය:

>>> 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

එය ආමන්ත්‍රණය කරන වෙනත් පිළිතුරු සඳහා පහත බලන්න.


මෙය නිවැරදි පිළිතුරයි
karamazovbros

394

pathlibපයිතන් 3.4+ හි භාවිතා කිරීම

from pathlib import Path

Path('/root/dir/sub/file.ext').stem

නැවත පැමිණේ

'file'

14
පයිතන් 3 සිට නිර්දේශිත ක්‍රමය මෙයයි
මිලාඩියස්

1
os.pathවිසඳුම් මෙන් , මෙය එක් දිගුවක් පමණක් ඉවත් කරනු ඇති බව සලකන්න (හෝ suffix, එය pathlibහඳුන්වන පරිදි). Path('a.b.c').stem == 'a.b'
බෝල්පොයින්ට්බෙන්

1
AllBallpointBen බහු උපසර්ග ඉවත් කිරීමේ ප්‍රශස්ත ක්‍රමය කුමක්ද? නිසැකවම වඩා හොඳ ක්‍රමයක් තිබිය යුතුයPath(Path('a.b.c').stem).stem
hoan

3
@hoan මම හිතන්නේ නැවත නැවත ඇමතීම .with_suffix('')යන්නට මාර්ගයයි. ඔබට බොහෝ විට ලූප වීමට අවශ්‍ය වනු ඇත p.suffix == ''.
බෝල්පොයින්ට්බෙන්

සංකීර්ණ දිගු සහිත ලිපිගොනු සඳහා එය ක්‍රියා නොකරනු ඇත: pathlib.Path('backup.tar.gz').stem-> 'backup.tarනමුත් අපේක්ෂිතbackup
පයිමන්

223
>>> print(os.path.splitext(os.path.basename("/path/to/file/hemanth.txt"))[0])
hemanth

7
මේ සඳහා +1. හරියටම එකම පිළිතුරු 3 ක්, නමුත් මෙය වඩාත්ම සෘජු පිළිතුරයි. ඔබට `කේතය පෙන්වීම සඳහා භාවිතා කළ හැකි අතර, "/somepath/hermanth.txt" මාර්ග උදාහරණයක් ලෙස දැක්විය හැකිය.
cregox

2
@ hemanth.hm ඔබ විසින් සපයන ලද මෙම ප්‍රකාශයේ os.path.basenameඅවශ්‍ය නොවන බව සලකන්න . os.path.basenameභාවිතා කළ යුත්තේ ගොනු මාර්ගයෙන් ගොනු නාමය ලබා ගැනීමට පමණි.
arrt_

79

පයිතන් 3.4+ හි ඔබට pathlibවිසඳුම භාවිතා කළ හැකිය

from pathlib import Path

print(Path(your_path).resolve().stem)

4
ඇයි ඔබ resolve()මාර්ගය යන්නේ? ගොනුවකට මාර්ගයක් ලබා ගත හැකි අතර එය නොමැතිව ගොනු නාමය මාර්ගයේ කොටසක් නොවන්නේද? මෙයින් අදහස් කරන්නේ ඔබ සිම්ලින්ක් සඳහා මාර්ගයක් ලබා දෙන්නේ නම්, ඔබ සිම්ලින්ක් වෙත යොමු කරන ගොනුවේ ගොනු දිගුව (දිගුවකින් තොරව) ආපසු ලබා දෙන බවයි.
බොරිස්

1
භාවිතා කළ හැකි එක් හේතුවක් resolve()වන්නේ බහු තිත් ගැටළුව සමඟ කටයුතු කිරීමට උපකාර කිරීමයි. මාර්ගය './foo.tar.gz' නම් දර්ශකය භාවිතා කිරීම පිළිබඳ පහත පිළිතුර ක්‍රියාත්මක නොවනු ඇත
විලියම් ඇල්කොක්

30

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

1
දිගුව පූර්ණ මාර්ගයකින් ඉවත් කිරීමේ සාමාන්‍ය නඩුව සඳහා හොඳම පයිතන් 3 විසඳුම මෙයයි. කඳ භාවිතා කිරීමෙන් මව් මාර්ගයද ඉවත් වේ. ඔබ ද්විත්ව දිගුවක් අපේක්ෂා කරන්නේ නම් (bla.tar.gz වැනි) එවිට ඔබට එය දෙවරක් භාවිතා කළ හැකිය: p.with_suffix (''). With_suffix ('').
ඊල්කෝ වෑන් ව්ලීට්

25

ඔබට ගොනුව වෙත යන මාර්ගය තබාගෙන දිගුව ඉවත් කිරීමට අවශ්‍ය නම්

>>> file = '/root/dir/sub.exten/file.data.1.2.dat'
>>> print ('.').join(file.split('.')[:-1])
/root/dir/sub.exten/file.data.1.2

16
ඔබට අවසාන කාල පරිච්ඡේදයේදී බෙදීමට අවශ්‍ය නම්, rsplit භාවිතා කරන්න:'/root/dir/sub.exten/file.data.1.2.dat'.rsplit('.', 1)
IceArdor

22

දිගුවේ බහු තිත් තිබේ නම් 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

1
index_of_dot = file_name.index ( '.') ඒ නිසා එය .env දී බෙදී ඩිග්රිය මෙම ගොනුවේ basename ලබා ගැනීෙමන් පසුව සිදු වනු ඇත
Dheeraj Chakravarthi

2
වැදගත් කරුණ නම්, මෙවැනි දිගු මාලාවක් පොදු ය. .tar.gz .tar.bz .tar.7z

2
'haystack'.index('needle')ඉඳිකටුවක් (ඉහත අවස්ථාවෙහිදී තිත, .) පිදුරු මල්ලේ සොයාගත නොහැකි නම් ValueError ව්‍යතිරේකයක් විසි කරන බව සලකන්න . කිසිදු දිගුවක් නොමැති ලිපිගොනු ද පවතී.
චෙක්නොලොජි

19

@ අයිස් ඇඩෝර්ස් rsplit යන්න අදහස් දක්වමින් @ user2902201 හි විසඳුම. rsplit යනු බහු කාල පරිච්ඡේදයන්ට සහාය වන සරලම විසඳුමයි.

මෙන්න එය අක්ෂර වින්‍යාසය:

file = 'my.report.txt'
print file.rsplit('.', 1)[0]

my.report


15

නමුත් මම OS ආනයනය කරන විට පවා මට එය path.basename ලෙස හැඳින්විය නොහැක. එය කෙළින්ම බේස් නාමය ලෙස හැඳින්විය හැකිද?

import os, ඉන්පසු භාවිතා කරන්න os.path.basename

importing osයන්නෙන් අදහස් os.fooනොකර ඔබට භාවිතා කළ හැකිය os.


1
ඔබට කෙලින්ම foo ඇමතීමට අවශ්‍ය නම් ඔබට භාවිතා කළ හැකිය from os import foo.
tgray

osමොඩියුලයේ සාමාජිකයෙකු සිටී නම් ඔබට එහි සම්මත නොවන අනුවාදයක් ඇත foo.
ටැඩ් මැක්ඩොනල්ඩ්-ජෙන්සන්

2
එය ස්ථාන දරන්නාගේ නමකි. (උදා: සලකා බලන්න path, හෝ walk).
ඩෙවින් ජීන්පියර්

15

අරාව සුචිගත කිරීමේ අවශ්‍යතාවයකින් තොරව 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'

os.path.splittext () යනු අනුවාදය 3.6+
Yzmir Ramirez

9

අනෙක් ක්‍රම බහු දිග ඉවත් නොකරයි. සමහරුන්ට දිගු නොමැති ගොනු නාමයන් සමඟ ද ගැටලු ඇත. මෙම ස්නිපටය පයිතන් 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)
raratiru

ගොනු නාමය සඳහා මෙය ක්‍රියා නොකරයි nvdcve-1.1-2002.json.zip
මිෂෙල්

මම එය fileBasename.split ('. Json') හි බෙදුවෙමි [0] එය ක්‍රියාත්මක විය
මිෂෙල්

4

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)

3

බහු දිගුව දැනුවත් කිරීමේ ක්‍රියා පටිපාටියක්. වැඩ 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'


0

වින්ඩෝස් පද්ධතියේ මම ඩ්‍රයිවර්නාම් උපසර්ගයද භාවිතා කළෙමි.

>>> s = 'c:\\temp\\akarmi.txt'
>>> print(os.path.splitext(s)[0])
c:\temp\akarmi

එබැවින් මට ඩ්‍රයිව් අකුරු හෝ නාමාවලි නාමයක් අවශ්‍ය නොවන නිසා මම භාවිතා කරන්නේ:

>>> print(os.path.splitext(os.path.basename(s))[0])
akarmi

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 සමඟ පරීක්ෂා කර ඇත.


0

මෙය විසඳීමට ඇති පහසුම ක්‍රමය නම්

import ntpath 
print('Base name is ',ntpath.basename('/path/to/the/file/'))

මෙය ඔබගේ කාලය සහ ගණනය කිරීමේ පිරිවැය ඉතිරි කරයි.


0

ඉතා ඉතා සරලව වෙනත් මොඩියුල නොමැත !!!

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)

0

මම එතරම් අමාරුවෙන් බැලුවේ නැත, නමුත් මෙම ගැටළුව සඳහා රීජෙක්ස් භාවිතා කළ කිසිවෙකු මා දුටුවේ නැත.

මම ප්‍රශ්නය අර්ථකථනය කළේ “මාර්ගයක් ලබා දී, දිගුවකින් තොරව මූලික නම ආපසු එවන්න” යනුවෙනි.

උදා

"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

-1

ගොනු නාමය උකහා ගැනීම සඳහා ( 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

os.path.splitext () [0] එකම දේ කරයි.
චාල්ස් ප්ලේගර්

දිගුවේ බහුවිධ තිත් තිබේ නම් har චාර්ල්ස් ප්ලේගර් os.path.splitext () ක්‍රියා නොකරයි. stackoverflow.com/a/37760212/1250044
yckart

එය මට වැඩ කරයි: [72]: os.path.splitext ('one.two.three.ext') පිටතට [72]: ('one.two.three', '.ext')
චාල්ස් ප්ලේගර්

-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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.