How to get the filename without the extension from a path in Python?
如何从python中的路径获取不带扩展名的文件名?
获取不带扩展名的文件名:
1 2 | import os print(os.path.splitext("path_to_file")[0]) |
只要滚动它:
1 2 3 4 5 6 7 8 | >>> 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' |
1 2 | >>> print(os.path.splitext(os.path.basename("hemanth.txt"))[0]) hemanth |
一个可读的版本,在python3.4中使用
1 2 3 | from pathlib import Path Path('/root/dir/sub/file.ext').stem |
将打印:
file
如果路径可以是符号链接,则添加
1 | Path('/root/dir/sub/file.ext').resolve().stem |
为了完整起见,下面是针对python 3.2+的
1 2 3 | from pathlib import Path print(Path(your_path).resolve().stem) |
如果要保留文件的路径并只删除扩展名
1 2 3 | >>> 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
1 2 3 4 5 | >>> 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进行切片,得到不带扩展名的文件名。
1 2 3 4 5 6 7 | >>> 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网站
在python3 pathlib中,"pathlib模块提供高级路径对象。"所以,
1 2 3 4 5 6 | >>> from pathlib import Path >>> p = Path("/a/b/c.txt") >>> print(p.with_suffix('')) \a\b\c >>> print(p.stem) c |
But even when I import os, I am not able to call it path.basename. Is it possible to call it as directly as basename?
@Iceador在对@user2902201解决方案的评论中提到了rsplit。rsplit是支持多个周期的最简单的解决方案。
这里写的是:
1 2 | file = 'my.report.txt' print file.rsplit('.', 1)[0] |
我的报告
我想我可以在不需要使用数组索引的情况下,对os.path.splitext的使用进行一个变更。
函数总是返回一个
例子:
1 2 3 4 5 6 7 | >>> import os >>> path = 'my_text_file.txt' >>> root, ext = os.path.splitext(path) >>> root 'my_text_file' >>> ext '.txt' |
1 | filename = C:\\Users\\Public\\Videos\\Sample Videos\\wildlife.wmv |
这将返回不带
1 | temp = os.path.splitext(filename)[0] |
现在你只需从临时工那里得到一个
1 | os.path.basename(temp) #this returns just the filename (wildlife) |
多扩展感知过程。适用于
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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) |
行为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | >>> 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 2 3 | import os path ="a/b/c/abc.txt" print os.path.splitext(os.path.basename(path))[0] |
在Windows系统上,我也使用了drivername前缀,比如:
1 2 3 | >>> s = 'c:\\temp\\akarmi.txt' >>> print(os.path.splitext(s)[0]) c:\temp\akarmi |
因此,因为我不需要驱动器号或目录名,所以我使用:
1 2 | >>> print(os.path.splitext(os.path.basename(s))[0]) akarmi |
我们可以做一些简单的
1 2 3 4 5 6 7 8 | 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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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 |
解决这一问题的最简单方法是
1 2 | import ntpath print('Base name is ',ntpath.basename('/path/to/the/file/')) |
这样可以节省时间和计算成本。
对于最大的秘密:
1 2 3 4 5 6 7 8 9 | 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] |
注意:这只是为了好玩。不要使用这个。用
为了方便起见,一个简单的函数包装了来自
1 2 3 4 5 6 7 8 9 10 | 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测试。