为什么从我可以在 Python 中读取的目录复制时权限被拒绝?

Why am I getting permission denied when copying from a directory I can read in Python?

我的家庭服务器 (Ubuntu) 上有一个非常大的混合文件类型的 Plex 库。我正在尝试使用 python 将兼容类型提取到客户端 iTunes 库中。我使用给我完全权限的凭据将它安装在 Windows 11 中作为 M:。这是我尝试 运行:

的片段
import os
from pathlib import Path
import shutil


for f in Path("M:/Music").rglob("**/*"):
    if not str(f).endswith(".opus"):  # iTunes doesn't like OPUS files
        filename = os.path.split(f)[1]
        local_root = Path("C:/Users/username/Music/iTunes Media/Automatically Add to iTunes").as_posix()
        
        album_dir = Path(f).parent.as_posix()
        album_dir_name = os.path.split(album_dir)[1]
        artist_dir = Path(album_dir).parent.as_posix()
        artist_dir_name = os.path.split(artist_dir)[1]
        
        new_artist_dir = os.path.join(local_root, artist_dir_name)
        new_album_dir = os.path.join(new_artist_dir, album_dir_name)
        new_file = os.path.join(new_album_dir, filename)

        shutil.copy(f, new_file)

shutil.copy 电话给我:

PermissionError:  [Errono 13] Permission denied: 'M:\Music\Academy of St Martin in the Fields'  # the first artist path in the rglob

我能够毫无问题地遍历并列出驱动器上的所有文件。在 Windows 中,我以完全权限安装了驱动器,我认为它是通过 os 模块继承给 Python 的。在我的工作场所,我能够 copy/move 从 NAS 到本地驱动器而无需任何额外登录,也是一个混合 Windows/Linux 环境。

我见过几个案例,人们通过 subprocess 使用 pywin32 或 Windows 自己的 net use 命令,但没有详尽的示例,也没有为我工作。如何使用 Python 从我安装的网络共享中复制内容?

如果您尝试打开一个文件,但您的路径是一个文件夹,就会发生这种情况。

这很容易发生错误。

要防御这种情况,请使用:

import os

path = r"my/path/to/file.txt"
assert os.path.isfile(path)
with open(path, "r") as f:
    pass

如果路径实际上是一个文件夹,断言将失败。