![](/img/trans.png)
[英]How To Remove the desktop.ini file from dataframe when using os Module in Python
[英]How to fix PermissionError in python when trying to write on desktop.ini file?
在使用此 python 腳本更改文件夾圖標后,我正在嘗試更改 desktop.ini 文件上的圖標資源,但我得到了這個:
發生異常:PermissionError [Errno 13] 權限被拒絕:'desktop.ini'
我試過以管理員身份運行,禁用 UAC,並更改文件的安全權限,但沒有答案。
import configparser
config = configparser.ConfigParser()
config.read('desktop.ini')
pieces = config['.ShellClassInfo']['iconresource'].split('\\')
del pieces[:-1]
config['.ShellClassInfo']['iconresource'] = pieces[0]
with open('desktop.ini','w') as configfile:
config.write(configfile)
發生異常:PermissionError [Errno 13] 權限被拒絕:'desktop.ini'
簡短的回答
如果要向 ini 文件添加內容,請在open()
function 中使用r+
模式,而不是w
模式。
with open(ini_path, "r+") as file:
file.write(ini_content)
否則請在下面查找“方法 2”。
長答案
為這個問題提供了一個很好的答案,為什么在嘗試對具有隱藏 (H) 或系統 (S) 屬性的文件調用 function open(some_path, 'w')
時會引發權限錯誤。 您可以通過手動創建一個新的隱藏文件來進行試驗,然后使用open(hidden_file_path, 'w')
; 它會引發同樣的錯誤。
在查看隱藏文件的更一般情況時,您可以找到建議暫時刪除隱藏屬性,覆蓋文件,然后重新添加屬性的人的答案。
import os
os.system(f"attrib -h {hidden_file_path}") # remove the "hidden" attribute
with open(hidden_file_path, 'w') as file:
file.write(new_content) # overwrite the file
os.system(f"attrib +h {hidden_file_path}") # add back the "hidden" attribute
如果出於任何原因您不控制hidden_file_path
變量的聲明,這可能是不安全的(請參閱“OS 命令注入”)。 此外,如果您嘗試使用它來覆蓋desktop.ini
文件,它將無法正常工作。 使用attrib
命令( os.system(f"attrib {hidden_file_path}")
或直接從命令行)進一步檢查顯示,正如預期的那樣,這些文件同時具有隱藏屬性和系統屬性 (SH)。 這意味着前面的方法應該同時考慮這兩個屬性。
# method 1
import os
os.system(f"attrib -h -s {ini_path}")
with open(ini_path, 'w') as file:
file.write(new_content)
os.system(f"attrib +h +s {ini_path}")
或者,更簡潔的選項是在調用open()
時僅使用r+
模式而不是w
。 到目前為止,在向desktop.ini
文件添加內容時,它對我有用。
# method 2
with open(ini_path, "r+") as file:
file.write(ini_content)
快速說明:僅當先前內容中的字符數小於或等於新內容中的字符數時,此方法才會完全覆蓋文件。 例如,如果文件的內容是12345
並且你想寫abc
,那么更新后的文件將包含abc45
; 而如果你寫abcdefg
,更新的文件將包含abcdefg
。
因此,如果您打算使用例如更短的圖標資源路徑來更新您的 ini 文件,那么使用方法 1 可能會更好。
使用 python 3.10.5 測試
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.