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

995

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

Joan Venge
sumber

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.

Geo
sumber
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.

Gimel
sumber
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'
mencolok
sumber
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
hemanth.hm
sumber
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)
Morgoth
sumber
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
jisnow
sumber
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

sumber
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
Dheeraj Chakravarthi
sumber
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

dlink
sumber
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.

Devin Jeanpierre
sumber
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'
ScottMcC
sumber
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
Alan W. Smith
sumber
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)
kode belajar
sumber
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'

sumber
1
import os
path = "a/b/c/abc.txt"
print os.path.splitext(os.path.basename(path))[0]
pengguna4949344
sumber
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
Zéiksz
sumber
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.

menangani
sumber
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.

Nkoro Joseph Ahamefula
sumber
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)
Bilal
sumber
-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
yaart
sumber
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
shivendra singh
sumber
-3

import os filename, file_extension = os.path.splitext ('/ d1 / d2 / example.cs') nama file adalah '/ d1 / d2 / contoh' file_extension is '.cs'

Antonio Ramasco
sumber