python - 一种创建文件和目录而不覆盖的方法

标签 python python-3.x

你知道当你下载一些东西并且下载文件夹包含一个同名文件时,文件不会覆盖它或抛出错误,而是在文件末尾附加一个数字吗?例如,如果我想下载my_file.txt,但它已经存在于目标文件夹中,新文件将被命名为my_file(2).txt。如果我再试一次,它将是 my_file(3).txt

我想知道 Python 3.x 中是否有一种方法可以检查并获得唯一的名称(不一定创建文件或目录)。我目前正在执行此操作:

import os
def new_name(name, newseparator='_')
    #name can be either a file or directory name

    base, extension = os.path.splitext(name)
    i = 2
    while os.path.exists(name):
        name = base + newseparator + str(i) + extension
        i += 1

    return name

在上面的示例中,如果 my_file.txt 已经存在,则运行 new_file('my_file.txt') 将返回 my_file_2.txt cwd。 name 也可以包含完整或相对路径,它也可以。

最佳答案

我会使用 PathLib并按照这些思路做一些事情:

from pathlib import Path 

def new_fn(fn, sep='_'):
    p=Path(fn)
    if p.exists():
        if not p.is_file(): 
            raise TypeError
        np=p.resolve(strict=True)
        parent=str(np.parent)
        extens=''.join(np.suffixes)  # handle multiple ext such as .tar.gz
        base=str(np.name).replace(extens,'')
        i=2
        nf=parent+base+sep+str(i)+extens    
        while Path(nf).exists():
            i+=1
            nf=parent+base+sep+str(i)+extens    
        return nf   
    else:       
        return p.parent.resolve(strict=True) / p 

这只处理写入的文件,但同样的方法也适用于目录(您稍后添加的目录)。我将把它作为一个项目留给读者。

关于python - 一种创建文件和目录而不覆盖的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53232299/

相关文章:

python - 如何在Python多模块的覆盖范围中排除目录

python - 为什么 Holoviews 在 Spyder 中不显示直方图?

python-3.x - ubuntu 18.04 上的 caffe 导入错误 : even after installing it successfully,

python - Heroku FFMPEG 后处理错误与 yt-dlp DownloadError

python - 单击输入按钮

python - multiprocessing.Pool apply_async 中的 error_callback 在 Python 2 中?

python - 抓取标签属性内的元素 - Scrapy

python - 使用 Scikit-Learn 使用分类数据制作回归模型

python - GAE 如何从表单请求中获取日期

python - 适当系列的列表数据框