파이썬의 경로에서 확장자가없는 파일 이름을 얻는 방법은 무엇입니까?


994

파이썬의 경로에서 확장자가없는 파일 이름을 얻는 방법은 무엇입니까?

답변:


1315

확장자가없는 파일 이름 얻기 :

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

19
파일 이름에 여러 개의 점이 포함되어 있으면 어떻게됩니까?
matteok

100
여러 점, splitext 분할이 마지막에있을 경우 matteok 같은 궁금 누군가를 위해, (그래서 splitext('kitty.jpg.zip')제공 ('kitty.jpg', '.zip')).

50
이 코드는 파일 이름 뿐만 아니라 전체 파일 경로 (확장자없이)를 반환합니다 .
Aran-Fey

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
미국식 영어로 "직접 만들기"를 의미하는 "자신의 롤"의 줄임말입니다.
Scott C Wilson

1
@ 앨런 스미스 (Alan W. Smith)는 "그냥 굴려 라"는 지난 10 년 동안 완벽하게 작동했습니다. "미국이 아닌"은 무엇을 의미합니까? 나는 당신의 편집에 찬성하지 않습니다.
Logic1

4
편집하면 더 명확 해집니다. 모든 사람이 영어를 모국어로 사용하는 것은 아니기 때문에 'roll it'과 같은 말로 혼란을 가중시킬 수 있습니다.
nxmohamad

327

pathlibPython 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

여러 접미사를 제거하는 최적의 방법은 무엇입니까? 확실히보다 더 나은 방법이 있어야합니다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"를 표시하는 데 사용할 수 있습니다 .
cregox

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()은 왜 길을합니까? 파일 경로를 가져오고 파일 이름이 없으면 경로의 일부가 아닌 것이 실제로 가능합니까? 즉, 심볼릭 링크의 경로를 지정하면 심볼릭 링크가 가리키는 파일의 파일 이름 (확장자없이)을 반환합니다.
Boris

1
사용 가능한 한 가지 이유 resolve()는 여러 도트 문제를 해결하는 데 도움이되기 때문 입니다. 경로가 './foo.tar.gz'인 경우 인덱스 사용에 대한 아래의 답변이 작동하지 않습니다.
William Allcock

30

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

파이썬 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 솔루션입니다. stem을 사용하면 부모 경로도 제거됩니다. 이중 확장 (예 : 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 Chakravarthi

2
이와 같은 일련의 확장이 일반적이라는 점이 중요합니다. .tar.gz .tar.bz .tar.7z

2
'haystack'.index('needle')(상기 경우의 도트 바늘이 경우에 ValueError 예외가 발생 .) 건초에서 발견되지 않는다. 확장자가없는 파일도 존재합니다.
Czechnology

15

@ IceAdor 's는 @ user2902201의 솔루션에 대한 의견에서 rsplit을 나타냅니다. rsplit은 여러 기간을 지원하는 가장 간단한 솔루션입니다.

여기에 철자가 있습니다.

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

my.report


13

그러나 os를 가져올 때도 path.basename이라고 부를 수 없습니다. 기본 이름으로 직접 호출 할 수 있습니까?

import os을 사용하여 os.path.basename

importING는 os당신이 사용할 수있는 것은 아닙니다 os.foo을 참조하지 않고 os.


1
foo를 직접 호출하려면을 사용할 수 있습니다 from os import foo.
tgray

os라는 멤버가 있으면 매우 비표준 버전의 모듈이 있습니다 foo.
Tadhg McDonald-Jensen 2016

2
자리 표시 자 이름입니다. (예 : path또는 walk).
Devin Jeanpierre

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 이상입니다.
Yzmir Ramirez

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

다중 확장 인식 절차 작동 strunicode경로. 파이썬 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'

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

0

Windows 시스템에서는 다음과 같이 drivername 접두사를 사용했습니다.

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

파일 이름을 추출하기 위해 여기 ( https://stackoverflow.com/a/424006/1250044 )에서 간단한 split/ pop마법을 수행 할 수 있습니다 ( 창과 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]도 같은 작업을 수행합니다.
Charles Plager

확장에 여러 개의 점이 있으면 @CharlesPlager os.path.splitext ()가 작동하지 않습니다. stackoverflow.com/a/37760212/1250044
yckart

그것은 나를 위해 작동합니다 :에서 [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 파일 이름, file_extension = os.path.splitext ( '/ d1 / d2 / example.cs') 파일 이름은 '/ d1 / d2 / example'입니다 file_extension은 '.cs'

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.