Як отримати ім'я файлу без розширення з шляху в Python?


Відповіді:


1314

Отримання файлу без розширення:

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.filename (path_to_file) замість os.path.splitext (os.path.basename (path_to_file)) [0]
Fnord

19
Що робити, якщо ім'я файлу містить кілька крапок?
matteok

100
Для тих, хто цікавиться тим же, що і matteok, якщо є кілька точок, сплітекст розпадається на останню (так splitext('kitty.jpg.zip')дає ('kitty.jpg', '.zip')).
Чак

50
Зауважте, що цей код повертає повний шлях до файлу (без розширення), а не лише ім'я файлу .
Аран-Фей

2
да, так що вам доведеться робити splitext(basename('/some/path/to/file.txt'))[0](що я завжди , здається, роблять)
CpILL

531

Ви можете зробити самостійно за допомогою:

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

Див. Нижче інші відповіді на цю адресу.


2
@ScottWilson: Вам все одно доведеться імпортувати os.
LarsH

35
Що означає "згортання"?
LarsH

49
Це коротке слово "roll your own", що означає "побудуй сам" в американській англійській мові.
Скотт C Вілсон

1
@Alan W. Smith, "Просто закатай:" працював чудово за останні 10 років. Що означає "менш американський"? Я не підтримую ваші зміни.
Логіка1

4
редагування робить це більш зрозумілим. не у всіх є англійська мова в якості їх першої мови, тож сказати щось на кшталт "згорнути його" могло б додати плутанину
nxmohamad

327

Використання pathlibв Python 3.4+

from pathlib import Path

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

повернеться

'file'

9
Це рекомендований шлях з пітона 3.
Miladiouss

1
Зауважте, що, як і os.pathрішення, це зніме лише одне розширення (або suffix, як pathlibйого називають). Path('a.b.c').stem == 'a.b'
BallpointBen

@BallpointBen, що є оптимальним способом зняття кількох суфіксів? Звичайно, має бути кращий спосіб, ніжPath(Path('a.b.c').stem).stem
хон

1
@hoan Я думаю, що неодноразовий виклик .with_suffix('')- це шлях. Ви, мабуть, хочете, щоб циклічно, поки p.suffix == ''.
BallpointBen

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

7
+1 для цього. 3 точні відповіді, але це найбільш пряма відповідь. Ви просто могли використати `для показу коду та "/somepath/hermanth.txt" як екземпляр шляху.
Крего

2
@ hemanth.hm Зауважте, що в цій заяві, яку ви надали, os.path.basenameне потрібно. os.path.basenameслід використовувати лише для отримання імені файлу з шляху до файлу.
arrt_

74

У Python 3.4+ ви можете використовувати pathlibрішення

from pathlib import Path

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

4
Навіщо вам resolve()шлях? Чи дійсно можливо отримати шлях до файлу, а не ім'я файлу бути частиною шляху без цього? Це означає, що якщо ви дасте шлях до символьного посилання, ви повернете ім'я файлу (без розширення) файла, на який вказує symlink.
Борис

1
Однією з можливих причин використання resolve()є допомога вирішити проблему з декількома точками. Відповідь нижче про використання індексу не буде працювати, якщо шлях "./foo.tar.gz"
Вільям Олдок

30

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

У python 3 pathlib "Модуль pathlib пропонує об'єкти шляху високого рівня." тому,

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

1
Це найкраще рішення python 3 для загального випадку видалення розширення з повного шляху. Використання стовбура також видаляє батьківський шлях. У випадку, якщо ви очікуєте подвійного розширення (наприклад, bla.tar.gz), ви навіть можете використовувати його двічі: p.with_suffix (''). With_suffix ('').
Eelco van Vliet

24

Якщо ви хочете зберегти шлях до файлу та просто видаліть розширення

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

21

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
Dheeraj

2
Важливий момент, оскільки серія таких розширень є звичайною. .tar.gz .tar.bz .tar.7z

2
Зауважте, що 'haystack'.index('needle')викидає виняток ValueError, якщо голка (у вищевикладеному випадку крапка, .) не знайдена в копиці сіна. Файли без будь-якого розширення також існують.
Czechnology

15

@ IceAdor's посилається на rsplit у коментарі до рішення @ user2902201. rsplit - найпростіше рішення, яке підтримує кілька періодів.

Тут прописано:

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

мій звіт


13

Але навіть коли я імпортую ОС, я не в змозі назвати це path.basename. Чи можна називати це так само безпосередньо, як базове ім'я?

import os, а потім скористайтеся os.path.basename

importing osне означає, що ви можете користуватися, os.fooне звертаючись до них os.


1
хоча якщо ви хочете зателефонувати безпосередньо до Foo, ви могли б скористатися from os import foo.
tgray

у вас дуже нестандартна версія osмодуля, якщо у нього є член, який називається foo.
Tadhg McDonald-Jensen

2
Це ім'я заповнювача. (наприклад, розглянути path, або walk).
Девін Жанп'єр

13

Думав, що я б міг змінити використання 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+
Ізмір Рамірес

6

Інші методи не видаляють кілька розширень. Деякі також мають проблеми з іменами файлів, які не мають розширень. Цей фрагмент має справу з обома екземплярами і працює як у Python 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 проти 8,39μs)
raratiru

Це не працює для імені файлу nvdcve-1.1-2002.json.zip
Michele

Я розділив його на fileBasename.split ('. Json') [0], і це спрацювало
Michele

4

import os

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

Це повертає функцію filenameбез extension(C: \ Користувачі \ Громадські \ Відео \ Зразок відео \ дикої природи)

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

Тепер ви можете отримати лише filenameз темп

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

3

Процедура обізнаності про кілька разів. Працює для strта unicodeдоріжок. Працює в Python 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

У системі Windows я також використовував префікс імені драйвера, як:

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

Тестований з Python 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)

-1

Ми можемо зробити кілька простих split/ popмагічних, як показано тут ( https://stackoverflow.com/a/424006/1250044 ), щоб витягти ім'я файлу (з урахуванням відмінностей Windows та 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] робить те саме.
Чарльз Плагер

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

-3

імпортувати ім'я файлу os, file_extension = os.path.splitext ('/ d1 / d2 / example.cs') ім'я файлу '/ d1 / d2 / example' file_extension is '.cs'

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.