Bagaimana cara mendapatkan nama file tanpa ekstensi dari jalur di Python?


Jawaban:


1316

Mendapatkan nama file tanpa ekstensi:

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

Cetakan:

/path/to/some/file

Dokumentasi untukos.path.splitext .

Catatan Penting: Jika nama file memiliki beberapa titik, hanya ekstensi setelah yang terakhir dihapus. Sebagai contoh:

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

Cetakan:

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

Lihat jawaban lain di bawah ini jika Anda perlu menangani kasus itu.


13
Jika ini adalah operasi yang cukup umum, mungkin harus pantas itu perintah resmi sendiri? Sesuatu seperti os.path.filename (path_to_file) alih-alih os.path.splitext (os.path.basename (path_to_file)) [0]
Fnord

19
Bagaimana jika nama file mengandung banyak titik?
matteok

101
Bagi siapa pun yang bertanya-tanya sama dengan matteok, jika ada beberapa titik, splitext membagi yang terakhir (jadi splitext('kitty.jpg.zip')memberi ('kitty.jpg', '.zip')).
Chuck

50
Perhatikan bahwa kode ini mengembalikan jalur file lengkap (tanpa ekstensi), bukan hanya nama file .
Aran-Fey

2
ya, jadi Anda harus melakukan splitext(basename('/some/path/to/file.txt'))[0](yang sepertinya selalu saya lakukan)
CpILL

531

Anda dapat membuatnya sendiri dengan:

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

Catatan penting: Jika ada lebih dari satu .dalam nama file, hanya yang terakhir dihapus. Sebagai contoh:

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

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

Lihat di bawah untuk jawaban lain yang membahas itu.


2
@ScottWilson: Anda masih harus mengimpor os.
LarsH

35
Apa yang dimaksud dengan 'roll it'?
LarsH

50
Singkatan dari "roll your own," yang berarti "bangun sendiri" dalam bahasa Inggris Amerika.
Scott C Wilson

2
@ Alan W. Smith, "Hanya roll it:" bekerja dengan baik selama 10 tahun terakhir. Apa artinya "kurang Amerika"? Saya tidak mendukung suntingan Anda.
Logika1

4
hasil edit membuatnya lebih jelas. tidak semua orang memiliki bahasa Inggris sebagai bahasa pertama mereka sehingga mengatakan sesuatu seperti 'roll it' dapat menambah kebingungan
nxmohamad

327

Menggunakan pathlibdalam Python 3.4+

from pathlib import Path

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

akan kembali

'file'

9
Ini adalah cara yang disarankan sejak python 3.
Miladiouss

1
Perhatikan bahwa, seperti os.pathsolusi, ini hanya akan menghapus satu ekstensi (atau suffix, sesuai pathlibpanggilannya). Path('a.b.c').stem == 'a.b'
BallpointBen

@BallpointBen apa cara optimal melucuti banyak sufiks? Tentunya harus ada cara yang lebih baik daripadaPath(Path('a.b.c').stem).stem
hoan

1
@hoan saya pikir berulang kali menelepon .with_suffix('')adalah cara untuk pergi. Anda mungkin ingin mengulang sampai p.suffix == ''.
BallpointBen

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

7
+1 untuk ini. 3 jawaban yang persis sama, tapi ini yang paling langsung. Anda bisa saja menggunakan `untuk menunjukkan kode, dan "/somepath/hermanth.txt" sebagai contoh path.
cregox

2
@ hemanth.hm Perhatikan bahwa dalam pernyataan yang Anda berikan ini, os.path.basenametidak perlu. os.path.basenameseharusnya hanya digunakan untuk mendapatkan nama file dari path file.
arrt_

74

Dalam Python 3.4+ Anda dapat menggunakan pathlibsolusinya

from pathlib import Path

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

4
Mengapa Anda resolve()jalan? Apakah benar-benar mungkin untuk mendapatkan path ke file dan tidak memiliki nama file menjadi bagian dari path tanpa itu? Ini berarti bahwa jika Anda memberikan path ke symlink, Anda akan mengembalikan nama file (tanpa ekstensi) dari file yang ditunjuk symlink.
Boris

1
Salah satu alasan yang mungkin untuk digunakan resolve()adalah untuk membantu menangani masalah multi-titik. Jawaban di bawah ini tentang menggunakan indeks tidak akan berfungsi jika jalurnya adalah './foo.tar.gz'
William Allcock

30

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

Dalam python 3 pathlib "Modul pathlib menawarkan objek jalur tingkat tinggi." begitu,

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

1
Ini adalah solusi python 3 terbaik untuk kasus umum menghapus ekstensi dari path lengkap. Menggunakan batang juga menghilangkan jalur induk. Jika Anda mengharapkan ekstensi ganda (seperti bla.tar.gz) maka Anda bahkan dapat menggunakannya dua kali: p.with_suffix (''). With_suffix ('').
Eelco van Vliet

24

Jika Anda ingin mempertahankan path ke file dan hapus saja ekstensi

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

16
Jika Anda ingin membagi pada periode terakhir, gunakan rsplit:'/root/dir/sub.exten/file.data.1.2.dat'.rsplit('.', 1)
IceArdor

21

os.path.splitext () tidak akan berfungsi jika ada beberapa titik dalam ekstensi.

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

Anda bisa menemukan indeks dari titik pertama di nama bas dan kemudian mengiris nama bas untuk mendapatkan hanya nama file tanpa ekstensi.

>>> 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 ('.') Ini akan dilakukan setelah mendapatkan nama dasar file sehingga tidak akan terpecah di .env
Dheeraj Chakravarthi

2
Poin penting, karena serangkaian ekstensi seperti ini adalah hal biasa. .tar.gz .tar.bz .tar.7z

2
Perhatikan bahwa 'haystack'.index('needle')melempar pengecualian ValueError jika jarum (dalam kasus di atas titik, .) tidak ditemukan di tumpukan jerami. File tanpa ekstensi juga ada.
Czechnology

15

@ IceAdor merujuk pada rsplit dalam komentar ke solusi @ user2902201. rsplit adalah solusi paling sederhana yang mendukung banyak periode.

Di sini itu dijabarkan:

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

laporan saya


13

Tetapi bahkan ketika saya mengimpor os, saya tidak dapat menyebutnya path.basename. Apakah mungkin untuk menyebutnya secara langsung sebagai nama dasar?

import os, lalu gunakan os.path.basename

importing ostidak berarti Anda dapat menggunakan os.footanpa mengacu os.


1
meskipun jika Anda ingin menelepon foo secara langsung, Anda dapat menggunakan from os import foo.
tgray

Anda memiliki versi osmodul yang sangat tidak standar jika memiliki anggota yang dipanggil foo.
Tadhg McDonald-Jensen

2
Itu nama placeholder. (mis. pertimbangkan path, atau walk).
Devin Jeanpierre

13

Pikir saya akan melempar variasi untuk penggunaan os.path.splitext tanpa perlu menggunakan pengindeksan array.

Fungsi selalu mengembalikan (root, ext)pasangan sehingga aman untuk digunakan:

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

Contoh:

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

os.path.splittext () adalah Versi 3.6+
Yzmir Ramirez

6

Metode lain tidak menghapus banyak ekstensi. Beberapa juga memiliki masalah dengan nama file yang tidak memiliki ekstensi. Cuplikan ini berkaitan dengan kedua instance dan bekerja di kedua Python 2 dan 3. Ini mengambil nama dasar dari jalan, membagi nilai pada titik-titik, dan mengembalikan yang pertama yang merupakan bagian awal dari nama file.

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

Berikut serangkaian contoh untuk dijalankan:

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

Dalam setiap kasus, nilai yang dicetak adalah:

FileName

Kecuali untuk nilai tambah penanganan banyak titik, metode ini jauh lebih cepat daripada Path('/path/to/file.txt').stem. (1,23μs vs 8,39μs)
raratiru

Ini tidak berfungsi untuk nama file nvdcve-1.1-2002.json.zip
Michele

Saya membaginya di fileBasename.split ('. Json') [0] dan berhasil
Michele

4

import os

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

Ini mengembalikan filenametanpa extension(C: \ Users \ Public \ Video \ Contoh Video \ satwa liar)

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

Sekarang Anda bisa mendapatkan hanya filenamedari temp dengan

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

3

Beberapa prosedur penyadaran ekstensi. Bekerja untuk strdan unicodejalur. Bekerja di Python 2 dan 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)

Tingkah laku:

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

Pada sistem Windows saya menggunakan awalan drivername juga, seperti:

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

Jadi karena saya tidak perlu huruf drive atau nama direktori, saya menggunakan:

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

0

Untuk kenyamanan, fungsi sederhana yang membungkus kedua metode dari 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

Diuji dengan Python 3.5.


0

cara termudah untuk menyelesaikan ini adalah dengan

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

ini menghemat waktu dan biaya perhitungan Anda.


0

Sangat sangat sangat sederhana tidak ada modul lain !!!

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

Kita bisa melakukan beberapa hal sederhana split/ popajaib seperti yang terlihat di sini ( https://stackoverflow.com/a/424006/1250044 ), untuk mengekstrak nama file (menghormati jendela dan perbedaan POSIX).

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] melakukan hal yang sama.
Charles Plager

@CharlesPlager os.path.splitext () tidak akan berfungsi jika ada beberapa titik dalam ekstensi. stackoverflow.com/a/37760212/1250044
yckart

Ini berfungsi untuk saya: Dalam [72]: os.path.splitext ('one.two.three.ext') Keluar [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 filename, file_extension = os.path.splitext ('/ d1 / d2 / example.cs') nama file adalah '/ d1 / d2 / contoh' file_extension is '.cs'

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.