如何从文件名中剪切焦油.gz扩展名



我在从文件名中删除扩展名时遇到问题。我尝试使用

os.path.splitext(checked_delivery)[0]

,但它仅从文件名中删除.gz。我需要检查文件是否有扩展名或它是一个目录。我用这个做到了:

os.path.exists(delivery)

但另一个问题是,由于其中的数据(YYYY。MM.DD(。我应该使用join()还是更具吸引力的东西,而不是大量的方法和 if?

我提出以下小函数:

def strip_extension(fn: str, extensions=[".tar.bz2", ".tar.gz"]):
for ext in extensions:
if fn.endswith(ext):
return fn[: -len(ext)]
raise ValueError(f"Unexpected extension for filename: {fn}")
assert strip_extension("foo.tar.gz") == "foo"

我提出了一个通用解决方案,使用pathlib模块从字符串中删除文件扩展名。如今,使用os来管理路径并不方便,IMO。

import pathlib

def remove_extention(path: pathlib.PosixPath) -> path.PosixPath:
suffixes = ''.join(path.suffixes)
return pathlib.Path(str(path).replace(suffixes, ''))

如果您知道扩展总是会.tar.gz,您仍然可以使用 split:

In [1]: fname = 'RANDOM_FILE-2017.06.07.tar.gz'
In [2]: '.'.join(fname.split('.')[:-2])
Out[2]: 'RANDOM_FILE-2017.06.07'

从 os.path.splitext 的文档字符串:

"Extension is everything from the last dot to the end, ignoring leading dots. "

在 gzip 压缩包的情况下,这无论如何都是有意义的,因为文件 'FILE.tar.gz' 是 'FILE.tar' 的 gzip 版本,它大概是由文件 'FILE' 制成的压缩包

这就是为什么你需要使用os.path.splitext以外的其他东西,如果你需要的是原始文件名,没有.tar