shutil.move(scr, dst) 出现 IOError: [Errno 13] 权限被拒绝 错误以及其他三个错误。

4
Documents = ['*pdf', '*docx', '*txt']

for i in range(len(Documents)):
    if glob.glob(Documents[i]):
        print(Documents[i], True)
        shutil.move(glob.glob(Documents[i])[0], '/home')

    else:
        print(Documents[i], False)

一切都很顺利,直到出现以下问题:

shutil.move(glob.glob(Documents[i])[0], '/home')

这基本上是:

shutil.move(scr, dst)

产生以下错误:

*pdf False
*docx True
Traceback (most recent call last):
  File "/usr/lib/python3.2/shutil.py", line 326, in move
    os.rename(src, real_dst)
OSError: [Errno 13] Permission denied

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "teste.py", line 19, in <module>
    shutil.move(glob.glob(Documents[i])[0], '/home')
  File "/usr/lib/python3.2/shutil.py", line 334, in move
    copy2(src, real_dst)
  File "/usr/lib/python3.2/shutil.py", line 146, in copy2
    copyfile(src, dst)
  File "/usr/lib/python3.2/shutil.py", line 99, in copyfile
    with open(dst, 'wb') as fdst:
IOError: [Errno 13] Permission denied: '/home/jesus.docx'

我尝试在src和dst中使用绝对路径,但没有成功。我浏览了网页并发现这可能与权限有关,但如果我必须更改权限,那么脚本的目的就会失败,这就是为什么在涉及权限之前我想在这里寻求帮助的原因。
那么,我该怎么办?
我的目的是移动Linux用户目录中的文件。(按文件格式进行排序...)例如-> .jpg ->图片,.pdf ->文档等等。(这就是为什么我不能让权限变得复杂...)
此外,我是一个编程新手(只是为了让你们不要太极客:D) 还有,这也是我在这个社区的第一个问题,所以如果我听起来迷失或冗长,请稍微耐心一点?谢谢
2个回答

4

你正在尝试将文件写入/home目录,这是不应该做的。

Linux是一种多用户操作系统。/home是所有用户主目录所在的位置。每个用户都应该有自己的目录在/home下,例如你的目录可以是/home/Joao

修改此行的最后一个参数:

shutil.move(glob.glob(Documents[i])[0], '/home')

to

shutil.move(glob.glob(Documents[i])[0], '/home/your_username')

以下是一些建议,希望能提高整体质量:

以下是需要翻译的内容:

# Variable names are lower case
documents = ["*.pdf", "*.docx", "*.txt"] 
# You iterate over a for loop like this. Python's for is like for-each. You get the actual item.
for doc in documents: 
    if glob.glob(doc):
        shutil.move(glob.glob(doc)[0], '/home/your_username/Documents')

1
只是想额外感谢你在for循环上的额外提示。 - Joao Guedes

1
您希望运行脚本的用户能够以提升的特权运行它。有一种叫做setuid位(设置用户标识)的东西,当设置时,将以所有者的特权运行脚本。还有一个setgid(设置组标识)位。
要设置它们,请成为root用户并执行:
chown root scriptname
chmod ug+s scriptname

这将同时设置setuid位和setgid位。

http://en.wikipedia.org/wiki/Setuid


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接