繁体   English   中英

Python - 如果链接存在,则覆盖它

[英]Python - overwrite a link if it exists

from os import link

link('WInd_Rose_Aguiar.svg', 'Wikipedia Daily Featured Picture')

# A day has passed

link('Piero_del_Pollaiuolo_-_Profile_Portrait_of_a_Young_Lady_-_Gemäldegalerie_Berlin_-_Google_Art_Project.jpg',
     'Wikipedia Daily Featured Picture') # Exception

调用上述脚本的结果:

my@comp:~/wtfdir$ python3 wtf.py
Traceback (most recent call last):
  File "wtf.py", line 8, in <module>
    'Wikipedia Daily Featured Picture') # Exception
FileExistsError: [Errno 17] File exists: 'Piero_del_Pollaiuolo_-_Profile_Portrait_of_a_Young_Lady_-_Gemäldegalerie_Berlin_-_Google_Art_Project.jpg' -> 'Wikipedia Daily Featured Picture'

创建第一个链接成功。 创建第二个失败。

这几乎不是我所期望的……我的意图是覆盖这个链接。

https://docs.python.org/3/library/os.html#os.link ⇐ 我看不到 ZC1C425268E68385D11Z5074 中的 ZC1C425268E68385D11Z5074 linkforceoverwrite_if_exists或类似参数

如何创建指向新源的链接,如果存在则覆盖以前的链接?

嗯,是的——我想我可以这样做:

from os import link, remove
from os.path import isfile

def force_link(src, dest):
    if isfile(dest):
        remove(dest)
    link(src, dest)

force_link('WInd_Rose_Aguiar.svg', 'Wikipedia Daily Featured Picture')

# A day has passed

force_link('Piero_del_Pollaiuolo_-_Profile_Portrait_of_a_Young_Lady_-_Gemäldegalerie_Berlin_-_Google_Art_Project.jpg',
     'Wikipedia Daily Featured Picture') # No longer exception

但这很麻烦,至少在理论上可能是不正确的(如果其他进程在remove(dest)link(src, dest)之间重新创建文件怎么办?)。 虽然也许可以解决这个(至少理论上的)不正确性,但生成的代码会更加麻烦,我猜......

必须有更好,更右手的方法来做到这一点!

为要公开的文件创建一个新链接。 然后用您刚刚创建的新链接替换您的固定链接。

from tempfile import TemporaryDirectory


def force_link(src, dest):
    with TemporaryDirectory(dir=os.path.dirname(dest)) as d:
        tmpname = os.path.join(d, "foo")
        os.link(src, tmpname)
        os.replace(tmpname, dest)

之后您可能需要确保对dest的权限是正确的。

os.link将成功在临时目录中安全地创建一个新链接。 然后,您将使用os.replace将临时链接安全地重命名为dest ,从而有效地用新链接覆盖旧链接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM