Python의 경로에서 확장자 없이 파일 이름을 얻는 방법은 무엇입니까?
예를 들어 "/path/to/some/file.txt"
"file"
원합니다.
질문자 :Joan Venge
Python의 경로에서 확장자 없이 파일 이름을 얻는 방법은 무엇입니까?
예를 들어 "/path/to/some/file.txt"
"file"
원합니다.
확장자가 없는 파일 이름 얻기:
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
해당 사례를 처리해야 하는 경우 아래의 다른 답변을 참조하세요.
사용 .stem
에서 pathlib
파이썬 3.4 이상
from pathlib import Path Path('/root/dir/sub/file.ext').stem
돌아올 것이다
'file'
파일 확장자가 여러 개인 경우 .stem
은 마지막 확장자만 제거합니다. 예를 들어 Path('file.tar.gz').stem
은 'file.tar'
반환합니다.
다음을 사용하여 직접 만들 수 있습니다.
>>> 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("/path/to/file/hemanth.txt"))[0]) hemanth
pathlib
에서는 pathlib 솔루션을 사용할 수 있습니다.
from pathlib import Path print(Path(your_path).resolve().stem)
https://docs.python.org/3/library/os.path.html
python 3 pathlib에서 "pathlib 모듈은 높은 수준의 경로 개체를 제공합니다." 그래서,
>>> from pathlib import Path >>> p = Path("/a/b/c.txt") >>> p.with_suffix('') WindowsPath('/a/b/c') >>> p.stem 'c'
확장에 점이 여러 개 있으면 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
파일 경로를 유지하고 확장자만 제거하려면
>>> file = '/root/dir/sub.exten/file.data.1.2.dat' >>> print ('.').join(file.split('.')[:-1]) /root/dir/sub.exten/file.data.1.2
@IceAdor's는 @user2902201의 솔루션에 대한 의견에서 rsplit을 참조합니다. rsplit은 여러 기간을 지원하는 가장 간단한 솔루션입니다.
다음과 같이 설명되어 있습니다.
file = 'my.report.txt' print file.rsplit('.', 1)[0]
my.report
하지만 os를 import해도 path.basename이라고 부를 수 없습니다. basename으로 직접 호출할 수 있습니까?
import os
os.path.basename
을 사용하십시오.
import
보내고 os
사용할 수있는 것은 아닙니다 os.foo
을 참조하지 않고 os
.
배열 인덱싱을 사용할 필요 없이 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'
다른 방법은 여러 확장을 제거하지 않습니다. 일부는 확장자가 없는 파일 이름에 문제가 있습니다. 이 스니펫은 두 인스턴스를 모두 다루며 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
다른 Pathlib 답변의 주석에서 언급했듯이 여러 접미사를 처리하는 것이 어색할 수 있습니다. 두 개 이하의 접미사는 .with_suffix('')
및 .stem
으로 처리하기에 나쁘지 않습니다.
from pathlib import Path pth = Path('foo/bar/baz.baz/thefile.tar.gz') fn = pth.with_suffix('').stem print(fn) # thefile
두 개 이상의 확장자가 있을 수 있는 경우 루프를 사용하여 0, 1 또는 많은 접미사가 있을 수 있는 일반적인 경우를 처리할 수 있습니다.
pth = Path('foo/bar/baz/thefile.tar.gz.bz.7zip') pth.name # 'thefile.tar.gz.bz.7zip' pth.suffixes # ['.tar', '.gz', '.bz', '.7zip']
그래서
fn = pth.name for s in pth.suffixes: fn = fn.rsplit(s)[0] print(fn) # thefile
또는
fnp = Path(pth.name) for _ in fnp.suffixes: fnp = fnp.with_suffix('') print(fnp) # thefile
여기서 fnp
는 경로이고 fn
은 문자열이며 선호하는 루프 형식을 결정할 수 있습니다.
예를 들어, 확장자가 .tar
, .tar.gz
, .tar.gz.bz
등이 될 수 있다면; 알려진 확장자를 간단히 rsplit
하고 첫 번째 요소를 사용할 수 있습니다.
pth = Path('foo/bar/baz.baz/thefile.tar.gz') fn = pth.name.rsplit('.tar')[0] print(fn) # thefile
import os filename, file_extension =os.path.splitext(os.path.basename('/d1/d2/example.cs'))
파일 이름은 '예제'입니다.
file_extension은 '.cs'입니다.
'
import os
filename = C:\\Users\\Public\\Videos\\Sample Videos\\wildlife.wmv
extension
없는 filename
을 반환합니다(C:\Users\Public\Videos\Sample Videos\wildlife).
temp = os.path.splitext(filename)[0]
이제 다음을 사용하여 임시 filename
만 얻을 수 있습니다.
os.path.basename(temp) #this returns just the filename (wildlife)
import os path = "a/b/c/abc.txt" print os.path.splitext(os.path.basename(path))[0]
다중 확장 인식 절차. 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.abcdefg') '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'
아주 아주 아주 간단하게 다른 모듈이 없습니다!!!
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)
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
이 문제를 해결하는 가장 쉬운 방법은
import ntpath print('Base name is ',ntpath.basename('/path/to/the/file/'))
이것은 시간과 계산 비용을 절약합니다.
파일 이름을 추출하기 위해 여기( 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
의 두 가지 메서드를 래핑하는 간단한 함수:
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로 테스트했습니다.
나는 열심히 보지 않았지만이 문제에 대해 정규식을 사용하는 사람을 보지 못했습니다.
나는 그 질문을 "경로가 주어지면 확장자 없이 기본 이름을 반환하라"고 해석했다.
예
"path/to/file.json"
=> "file"
"path/to/my.file.json"
=> "my.file"
pathlib
없이 살고 있는 Python 2.7에서 ...
def get_file_name_prefix(file_path): basename = os.path.basename(file_path) file_name_prefix_match = re.compile(r"^(?P<file_name_pre fix>.*)\..*$").match(basename) if file_name_prefix_match is None: return file_name else: return file_name_prefix_match.group("file_name_prefix")
get_file_name_prefix("path/to/file.json") >> file get_file_name_prefix("path/to/my.file.json") >> my.file get_file_name_prefix("path/to/no_extension") >> no_extension
@spinup 답변 개선:
fn = pth.name for s in pth.suffixes: fn = fn.rsplit(s)[0] break print(fn) # thefile
이것은 확장자가 없는 파일 이름에서도 작동합니다.
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
답변을 읽었으며 좋은 솔루션이 많이 있음을 알았습니다. 따라서 (이름 또는 확장명)을 얻으려는 사람들을 위해 os 모듈을 사용하는 또 다른 솔루션이 있습니다. 두 방법 모두 확장자가 여러 개인 파일을 지원합니다.
import os def get_file_name(path): if not os.path.isdir(path): return os.path.splitext(os.path.basename(path))[0].split(".")[0] def get_file_extension(path): extensions = [] copy_path = path while True: copy_path, result = os.path.splitext(copy_path) if result != '': extensions.append(result) else: break extensions.reverse() return "".join(extensions)
참고: Windows의 이 솔루션은 "\" 문자가 있는 파일 이름을 지원하지 않습니다.
출처 : http:www.stackoverflow.com/questions/678236/how-to-get-the-filename-without-the-extension-from-a-path-in-python
Vim에서 줄 끝으로 어떻게 이동합니까? (0) | 2023.04.24 |
---|---|
SSH를 사용하여 원격 시스템에서 로컬 쉘 스크립트를 실행하는 방법은 무엇입니까? (0) | 2023.04.24 |
전역 Git 구성을 어떻게 표시합니까? (0) | 2023.04.24 |
JavaScript에서 부동 소수점 수를 정수로 어떻게 변환합니까? (0) | 2023.04.24 |
JavaScript의 객체 비교 [중복] (1) | 2023.04.24 |