Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 一种在不覆盖的情况下创建文件和目录的方法_Python_Python 3.x - Fatal编程技术网

Python 一种在不覆盖的情况下创建文件和目录的方法

Python 一种在不覆盖的情况下创建文件和目录的方法,python,python-3.x,Python,Python 3.x,你知道当你下载某个东西时,下载文件夹包含一个同名的文件,而不是覆盖它或抛出一个错误,文件的结尾会附加一个数字吗?例如,如果我想下载my_file.txt,但它已存在于目标文件夹中,则新文件将命名为my_file(2.txt。如果我再试一次,它将是我的_文件(3.txt 我想知道在Python3.x中是否有一种方法可以检查并获得唯一的名称(不一定创建文件或目录)。我目前正在通过以下方式实施它: import os def new_name(name, newseparator='_') #

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

我想知道在Python3.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
在上面的示例中,如果cwd中已经存在
my_file.txt
,则运行
new_file('my_file.txt')
将返回
my_file_2.txt
<代码>名称也可以包含完整或相对路径,它也可以工作。

我将使用并执行以下操作:

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 

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

另一种获取新名称的方法是使用内置的
tempfile
模块:

from pathlib import Path
from tempfile import NamedTemporaryFile

def new_path(path: Path, new_separator='_'):
    prefix = str(path.stem) + new_separator
    dir = path.parent
    suffix = ''.join(path.suffixes)

    with NamedTemporaryFile(prefix=prefix, suffix=suffix, delete=False, dir=dir) as f:
        return f.name
如果从下载目录中执行此函数,您将得到如下结果:

>>> new_path(Path('my_file.txt'))
'/home/krassowski/Downloads/my_file_90_lv301.txt'
其中
90_lv301
部分由Python的
tempfile
模块内部生成

注意:使用
delete=False
参数,函数将使用新名称创建(并保留未删除)一个空文件。如果不希望以这种方式创建空文件,只需删除
delete=False
,但保留它将阻止其他任何人在下一次操作之前创建具有此名称的新文件(尽管他们仍可能覆盖它)


简单地说,如果您(或最终用户)要同时运行程序两次,使用
delete=False
可以防止并发问题。

我不明白:您的问题是python函数覆盖文件/目录而不告诉您问题所在?或者,如果文件已经存在,是否需要一个内置函数自动将数字添加到文件名中?你永远找不到后者,因为它是特定于应用程序的,与操作系统无关。
pathlib
对这样的东西非常有用:特别是,请查看
Path.touch(mode=0o666,exist\u ok=True)
。。。您已经编写了一个解决问题的解决方案,但是您想知道它是否已经在某个地方得到了解决,并且是标准Python3发行版的一部分?你介意解释一下原因吗?我真的看不出有什么意义honest@Karl:它比更常见的“plz什么内置功能完成以下复杂任务:(需求列表)”要好。是的。我不知道我的语气是否给人以讽刺的感觉。我不是那个意思,我只是好奇。如果OP已经想出了一个好的解决方案,为什么不保留它呢?只为最后一行投票!我只需阅读文档,确认您没有犯愚蠢的错误(
;)
那么,斜杠运算符重载了吗?@usr2564301:是的,
/
重载了与
os.path.join
等价的内容。请参阅
p.parent.resolve(strict=True)/p
的效果,无论是使用绝对路径、本地路径还是相对路径调用,都会返回绝对路径。传授PathLib的一些优点(我不知道)(sutf类似
path.后缀
path.resolve
)会获得额外的积分。我将尝试从os移动到PathLib。另外:我认为没有严格的内置方法,所以我会接受他的答案。我不熟悉“def-fun(var:Class)”符号,用标点符号在谷歌上搜索东西是件急事。这是否运行了某种断言来检查传递的值是否是tha类的实例?不,如果给定类型与预期类型不匹配,它不会引发任何异常,只是程序员向他提示预期类型(以及IDE显示更好的建议)。它被称为(ing),并在Python3.5中引入,非常好。我很好奇为什么我没有经常看到它。