iT邦幫忙

0

python shutil.copy 出現errno13

  • 分享至 

  • xImage

最近在學python遇到了些問題..

程式如下:

#shutil模組
import os,shutil
cur_path=os.path.dirname(__file__)

if shutil.copyfile(cur_path+'\SQL2.py' , 'abc.py'):
    print("success") 
    
if shutil.copy(cur_path , "cba"):
    print("success") 

copyfile是有辦法執行的,但下面的copy就會出現
PermissionError: [Errno 13] Permission denied: 'd:\python\ch4'

網路上查到的解決辦法是把取消唯獨
https://ithelp.ithome.com.tw/upload/images/20230808/201526155z9KwIjKpO.png
所以把上面那個唯獨取消掉
但再次查看的時候,那個唯獨又被勾上了

也試過用cmd輸入attrib -r D:\python也沒有用

所以想問要怎麼解決?

froce iT邦大師 1 級 ‧ 2023-08-08 08:07:48 檢舉
安全性那邊把你的帳號加進去。
然後給完全控制的權限。
pickuse iT邦新手 3 級 ‧ 2023-08-08 08:56:09 檢舉
附上程式碼的時候請考慮給予「純文字」,並且使用 ``` markdown ``` 語法將其包裹,會更容易獲得別人的幫助。
jax7479 iT邦新手 5 級 ‧ 2023-08-08 14:02:57 檢舉
安全性的部分,有試過把權限變成完全控制了,但還是失敗
雖然現在資料夾唯讀的屬性還是改不了,但程式已經可以跑了!謝謝
然後程式碼純文字的部分已修正!
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
pickuse
iT邦新手 3 級 ‧ 2023-08-08 09:13:55
最佳解答

你確定你路徑可以那樣子寫嗎?
我建議你試著把 cur_path 印出來看一下裡面有什麼東西...

以下附上完整範例(注意:你寫了兩個複製的動作):

# 引入os模組,提供了許多與作業系統互動的功能
import os

# 引入shutil模組,提供了許多檔案操作的功能
import shutil

# 獲取當前檔案(__file__)的路徑
cur_path = os.path.dirname(__file__)

# 使用os.path.join函數,將路徑與檔名結合,獲取來源檔案(a.txt)的完整路徑
src_file = os.path.join(cur_path, 'a.txt')

# 使用os.path.join函數,將路徑與檔名結合,獲取目標檔案(b.txt)的完整路徑
dst_file = os.path.join(cur_path, 'b.txt')

# 使用shutil.copyfile函數,將來源檔案複製到目標檔案
# 如果複製成功,則會返回目標檔案的路徑
if shutil.copyfile(src_file, dst_file):
    print("success")

# 使用shutil.copy函數,將來源檔案複製到目標檔案
# 此函數除了複製檔案內容外,還會嘗試複製檔案的權限等信息
# 如果複製成功,則會返回目標檔案的路徑
if shutil.copy(src_file, dst_file):
    print("success")

執行結果
https://ithelp.ithome.com.tw/upload/images/20230808/20155998WetoG9dWhY.jpg

jax7479 iT邦新手 5 級 ‧ 2023-08-08 13:57:42 檢舉

謝謝!改成完整路徑就成功了!
然後也謝謝提醒程式碼提供純文字的部分,已經改正了!下次也會注意的

0
hokou
iT邦好手 1 級 ‧ 2023-08-08 09:04:59

參考以下資訊,應該是你的 cur_path 是一個資料夾路徑 d:\python\ch4,而不是檔案路徑

shutil.copy(src, dst, *, follow_symlinks=True)
将文件 src 拷贝到文件或目录 dst。 src 和 dst 应为 路径类对象 或字符串。 如果 dst 指定了一个目录,文件将使用 src 中的基准文件名拷贝到 dst 中。 如果 dst 指定了一个已存在的文件,它将被替换。 返回新创建文件所对应的路径。

src 為檔案路徑,而不是資料夾路徑

# 用copy复制文件:src是文件路径,dst可以是文件或目录
shutil.copy("J:\\src_path\\test.txt","J:\\dst_path\\") 

參考:
shutil --- 高阶文件操作
解决shutil.copyfile常见错误:PermissionError: [Errno 13] Permission denied
Why would shutil.copy() raise a permission exception when cp doesn't?

jax7479 iT邦新手 5 級 ‧ 2023-08-08 13:51:57 檢舉

謝謝!改成檔案路徑就成功了!

看到網路上有人寫shutil.copy(a,b)的a可以是目錄就盲從了..

我要發表回答

立即登入回答