簡體   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