Program Tip

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

programtip 2020. 9. 28. 09:56
반응형

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


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


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

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

인쇄물:

/path/to/some/file

중요 참고 : 파일 이름에 여러 개의 점이있는 경우 마지막 점 이후의 확장자 만 제거됩니다. 예를 들면 :

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

인쇄물:

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

이 경우를 처리해야하는 경우 아래의 다른 답변을 참조하십시오.


다음을 사용하여 직접 만들 수 있습니다.

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

이를 해결하는 다른 답변은 아래를 참조하십시오.


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

pathlibPython 3.4 이상에서 사용

from pathlib import Path

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

돌아올 것이다

file

완전성을 위해 다음은 pathlibpython 3.2+에 대한 솔루션입니다.

from pathlib import Path

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

파일 경로를 유지하고 확장자 만 제거하려면

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

확장에 여러 점이 있으면 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

basename에서 첫 번째 점의 인덱스를 찾은 다음 basename을 슬라이스하여 확장자가없는 파일 이름 만 얻을 수 있습니다.

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

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

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

여기에 철자가 있습니다.

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

my.report


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

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

importing 을 참조하지 않고 os사용할 수 있다는 의미는 아닙니다 .os.fooos


배열 인덱싱을 사용할 필요없이 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'

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)

다중 확장 인식 절차. strunicode경로에 대해 작동 합니다. 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'

다른 방법은 여러 확장을 제거하지 않습니다. 일부는 확장자가없는 파일 이름에 문제가 있습니다. 이 스 니펫은 두 인스턴스를 모두 처리하고 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

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

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

So because I do not need drive letter or directory name, I use:

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

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

We could do some simple split / pop magic as seen here (https://stackoverflow.com/a/424006/1250044), to extract the filename (respecting the windows and POSIX differences).

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

the easiest way to resolve this is to

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

this saves you time and computation cost.


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


For convenience, a simple function wrapping the two methods from 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

Tested with Python 3.5.


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

For maximum esoterica, and for a fun oneliner, and to learn a little about itertools:

def strip_suffix(filename):
    """
    >>> video.mp4
    video

    >>> video.extra.mp4
    video.extra
    """
    return ''.join((name_dot[0] + name_dot[1] for name_dot in itertools.zip_longest(filename.split('.')[0:-1], '.', fillvalue='.')))[0:-1]

Note: this is just for fun. Do not use this. Use os.path.splitext instead


I think the easiest way is to use .split("/")

input= "PATH/TO/FILE/file.txt" file_only = input.split("/")[-1] print(file_only)

>>> file.txt

You can also do this to extract the last folder:

input= "PATH/TO/FOLDER" folder_only = input.split("/")[-1] print(folder_only)

>>> FOLDER

If you want the penultimate folder, simply change [-1] to [-2].

참고URL : https://stackoverflow.com/questions/678236/how-to-get-the-filename-without-the-extension-from-a-path-in-python

반응형