Python'daki bir yoldan uzantı olmadan dosya adını nasıl alabilirim?


Yanıtlar:


1315

Uzantı olmadan dosyanın adını alma:

import os
print(os.path.splitext("/path/to/some/file.txt")[0])

Baskılar:

/path/to/some/file

İçin belgeleros.path.splitext .

Önemli Not: Dosya adında birden çok nokta varsa, yalnızca sonuncusundan sonraki uzantı kaldırılır. Örneğin:

import os
print(os.path.splitext("/path/to/some/file.txt.zip.asc")[0])

Baskılar:

/path/to/some/file.txt.zip

Bu durumu ele almanız gerekiyorsa aşağıdaki diğer yanıtlara bakın.


13
Bu yeterince yaygın bir işlemse, belki de kendi resmi emrini hak etmelidir? Os.path.splitext (os.path.basename (path_to_file) yerine os.path.filename (path_to_file) gibi bir şey) [0]
Fnord

19
Dosya adı birden çok nokta içeriyorsa ne olur?
matteok

100
Matteok ile aynı şeyi merak eden herkes için, eğer birden fazla nokta varsa, splitext en sonda böler (böylece splitext('kitty.jpg.zip')verir ('kitty.jpg', '.zip')).
Chuck

50
Bu kodun yalnızca dosya adını değil , tam dosya yolunu (uzantısız) döndürdüğünü unutmayın .
Aran-Fey

2
evet, bu yüzden yapmanız gerekir splitext(basename('/some/path/to/file.txt'))[0](ki her zaman yapıyor gibi görünüyor)
CpILL

531

Şunları yapabilirsiniz:

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

Önemli not: .Dosya adında birden fazla varsa , yalnızca sonuncusu kaldırılır. Örneğin:

/root/dir/sub/file.ext.zip -> file.ext

/root/dir/sub/file.ext.tar.gz -> file.ext.tar

Bu konuyu ele alan diğer cevaplar için aşağıya bakın.


2
@ScottWilson: Yine de içe aktarmanız gerekiyor os.
LarsH

35
'Döndür' ne demek?
LarsH

49
Amerikan İngilizcesinde "kendin yap" kısaltması anlamına gelir.
Scott C Wilson

1
@Alan W. Smith, "Sadece yuvarla:" son 10 yıldır gayet iyi çalışıyordu. "Daha az Amerikalı" ne demektir? Yaptığınız düzenlemelerden yana değilim.
Mantık1

4
düzenleme daha net hale getirir. herkesin ilk dili İngilizce değildir, bu yüzden '
yuvarla

327

pathlibPython 3.4 ve sonraki sürümlerinde kullanma

from pathlib import Path

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

geri dönücek

'file'

9
Bu python 3'ten beri önerilen yol.
Miladiouss

1
Gibi, Not os.pathçözeltiler, bu sadece (veya bir uzantı şerit olacak suffixşekilde, pathlibaramaları bu). Path('a.b.c').stem == 'a.b'
BallpointBen

@BallpointBen Birden fazla son eki soymanın en iyi yolu nedir? Şüphesiz daha iyi bir yolu olmalıPath(Path('a.b.c').stem).stem
Hoan

1
@hoan Sanırım art arda çağırmanın .with_suffix('')yolu bu. Muhtemelen şu ana kadar döngüde bulunmak istersiniz p.suffix == ''.
BallpointBen

218
>>> print(os.path.splitext(os.path.basename("hemanth.txt"))[0])
hemanth

7
Bunun için +1. 3 aynı cevap, ama bu en doğrudan cevap. Sadece kullanmış olabilir `bir yol örneği olarak kodunu ve "/somepath/hermanth.txt" göstermek için.
cregox

2
@ hemanth.hm Verdiğiniz bu açıklamada os.path.basenamegerekli olmadığını unutmayın. os.path.basenameyalnızca dosya adını dosya yolundan almak için kullanılmalıdır.
arrt_

74

Python 3.4+ sürümünde pathlibçözümü kullanabilirsiniz

from pathlib import Path

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

4
Neden resolve()yolu yapıyorsun ? Bir dosyaya yol almak ve dosya adının yolun bir parçası olmaması gerçekten mümkün mü? Bu, sembolik bağ için bir yol verirseniz, sembolik bağlantının işaret ettiği dosyanın dosya adını (uzantısız) döndüreceğiniz anlamına gelir.
Boris

1
Kullanmanın olası bir nedeni resolve(), çoklu nokta sorunuyla başa çıkmaya yardımcı olmaktır. Dizin kullanımıyla ilgili aşağıdaki yanıt, yol './foo.tar.gz' ise işe yaramaz
William Allcock

30

https://docs.python.org/3/library/os.path.html

Python 3'de pathlib "pathlib modülü üst düzey yol nesneleri sunar." yani,

>>> from pathlib import Path
>>> p = Path("/a/b/c.txt")
>>> print(p.with_suffix(''))
\a\b\c
>>> print(p.stem)
c

1
Bu, uzantıyı tam yoldan kaldırmanın genel durumu için en iyi python 3 çözümüdür. Stem kullanıldığında ana yol da kaldırılır. Çift bir uzantı bekliyorsanız (bla.tar.gz gibi), iki kez bile kullanabilirsiniz: p.with_suffix (''). With_suffix ('').
Eelco van Vliet

24

Dosyanın yolunu korumak ve yalnızca uzantıyı kaldırmak istiyorsanız

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

16
Son dönemde bölmek isterseniz, rsplit kullanın:'/root/dir/sub.exten/file.data.1.2.dat'.rsplit('.', 1)
IceArdor

21

Uzantıda birden çok nokta varsa os.path.splitext () çalışmaz .

Örneğin, 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

Sadece taban adındaki ilk noktanın dizinini bulabilir ve daha sonra uzantı olmadan sadece dosya adını almak için taban adını dilimleyebilirsiniz.

>>> 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 ( '') Bu .env bölünmüş alışkanlık böylece dosyanın basename aldıktan sonra yapılacaktır
Dheeraj Chakravarthi

2
Önemli nokta, bunun gibi bir dizi uzantı yaygındır. .tar.gz .tar.bz .tar.7z

2
Not 'haystack'.index('needle')(yukarıdaki durumda nokta, iğne eğer bir ValueError istisna atar .) samanlıkta bulunamadı. Uzantısı olmayan dosyalar da vardır.
Mart'ta Çek Teknolojisi

15

@ IceAdor's, @ user2902201'in çözümüne yaptığı bir yorumda rsplit anlamına gelir. rsplit, çoklu periyotları destekleyen en basit çözümdür.

Burada yazılmıştır:

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

benim raporum


13

Ancak işletim sistemini içe aktardığımda bile, path.basename olarak adlandıramıyorum. Doğrudan basename olarak adlandırmak mümkün mü?

import osve ardından os.path.basename

importing os, os.foobaşvurmadan kullanabileceğiniz anlamına gelmez os.


1
Eğer doğrudan foo aramak istiyorsanız kullanabilirsiniz from os import foo.
tgray

osadlı bir üyesi varsa modülün çok standart olmayan bir sürümüne sahipsiniz foo.
Tadhg McDonald-Jensen

2
Bu bir yer tutucu adı. (örneğin, düşünün pathveya walk).
Devin Jeanpierre

13

Dizi indeksleme kullanmadan os.path.splitext kullanımı için bir varyasyon atmak düşündüm .

İşlev her zaman bir (root, ext)çift döndürür, böylece kullanımı güvenlidir:

root, ext = os.path.splitext(path)

Misal:

>>> import os
>>> path = 'my_text_file.txt'
>>> root, ext = os.path.splitext(path)
>>> root
'my_text_file'
>>> ext
'.txt'

os.path.splittext () Versiyon 3.6+
Yzmir Ramirez

6

Diğer yöntemler birden fazla uzantıyı kaldırmaz. Bazılarının uzantıları olmayan dosya adlarında da sorunları vardır. Bu snippet hem örneklerle ilgilenir hem de Python 2 ve 3'te çalışır. Taban adını yoldan alır, değeri noktalara böler ve dosya adının ilk kısmı olan ilkini döndürür.

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

Çalıştırmak için bir dizi örnek:

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

Her durumda, yazdırılan değer:

FileName

Birden çok noktayı işlemenin katma değeri dışında, bu yöntem çok daha hızlıdır Path('/path/to/file.txt').stem. (1,23μs vs 8.39μs)
raratiru

Bu nvdcve-1.1-2002.json.zip dosya adı için çalışmaz
Michele

DosyaBasename.split ('. Json') [0] üzerine böltüm ve işe yaradı
Michele

4

import os

filename = C:\\Users\\Public\\Videos\\Sample Videos\\wildlife.wmv

Bu filename, extension(C: \ Users \ Genel \ Videolar \ Örnek Videolar \ vahşi yaşam) olmadan döndürür

temp = os.path.splitext(filename)[0]  

Şimdi sadece filenametemp ile alabilirsiniz

os.path.basename(temp)   #this returns just the filename (wildlife)

3

Çoklu uzatma farkında bir prosedür. Çalışır strve unicodeyollar. Python 2 ve 3'te çalışır.

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)

Davranış:

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

1
import os
path = "a/b/c/abc.txt"
print os.path.splitext(os.path.basename(path))[0]

0

Windows sisteminde drivername önekini de kullandım, örneğin:

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

Sürücü harfine veya dizin adına ihtiyaç duymadığım için şunu kullanıyorum:

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

0

Kolaylık sağlamak için, iki yöntemi saran basit bir işlev 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

Python 3.5 ile test edilmiştir.


0

bunu çözmenin en kolay yolu

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

bu size zaman ve hesaplama maliyeti kazandırır.


0

Çok çok çok basit başka modül yok !!!

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)

-1

Dosya adını ayıklamak için (pencerelere ve POSIX farklılıklarına saygı göstererek) burada görüldüğü gibi basit split/ popsihir yapabiliriz ( https://stackoverflow.com/a/424006/1250044 ).

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] aynı şeyi yapar.
Charles Plager

@CharlesPlager os.path.splitext (), uzantıda birden çok nokta varsa çalışmaz. stackoverflow.com/a/37760212/1250044
yckart

Benim için çalışıyor: [72]: os.path.splitext ('one.two.three.ext') Out [72]: ('one.two.three', '.ext')
Charles Plager

-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

-3

import os dosya adı, file_extension = os.path.splitext ('/ d1 / d2 / example.cs') dosya adı '/ d1 / d2 / örnek' file_extension '.cs'

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.