Python - IOError:[Errno 13] 权限被拒绝:

60

我遇到了IOError: [Errno 13] Permission denied的错误,但我不知道这段代码出了什么问题。

我试图读取一个指定了绝对路径(只给出file.asm)和相对路径(意味着/.../file.asm),并希望程序将文件写入给定的路径 - 如果是绝对路径,则应将其写入当前目录;否则,写入给定的路径。

代码如下:

#call to main function
if __name__ == '__main__':
    assem(sys.argv[1])


import sys

def assem(myFile):
    from myParser import Parser
    import code
    from symbolTable import SymbolTable

    table=SymbolTable()

    # max size of each word
    WORD_SIZE = 16
    # rom address to save to
    rom_addrs = 0
    # variable address to save to
    var_addrs = 16

    # new addition
    if (myFile[-4:] == ".asm"):
        newFile = myFile[:4]+".hack"

    output = open(newFile, 'w') <==== ERROR

给出的错误信息:

IOError: [Errno 13] Permission denied: '/Use.hack'

我执行代码的方式:

python assembler.py Users/***/Desktop/University/Add.asm 

我在这里做错了什么?


3
很可能您没有写入根目录的权限,这是正确的,看起来是这样。 - Ingo
11个回答

44

只需关闭您将要写入的已打开文件。


16
这个回答与问题毫无关系。 - user149341
2
这对我有用,这个人的意思是,如果你要保存的文件夹已经打开了,你需要关闭它。 - Gramatik

18

看起来你正在尝试使用以下代码替换扩展名:

if (myFile[-4:] == ".asm"):
    newFile = myFile[:4]+".hack"

然而,您似乎混淆了数组索引。请尝试以下操作:

if (myFile[-4:] == ".asm"):
    newFile = myFile[:-4]+".hack"
注意代码的第二行中使用了-4而不是4。这就解释了为什么你的程序试图创建/Use.hack,这是你文件名的前四个字符/Use),并在其后附加.hack的原因。

是的,你说得对。但现在我收到了以下错误信息: IOError: [Errno 2] No such file or directory: 'Users/itzikhanoch/Desktop/University/Add.hack'我使用的是“w”,为什么他找不到任何文件呢?它应该写入文件。 - Itzik984
4
现在看起来你传递的是 User/... 而不是 /User/...,请注意前面的斜杠,这很重要。如果没有前导斜杠,你正在尝试打开当前目录下名为 User子目录中的文件。 - Greg Hewgill

12

你没有足够的权限写入根目录。看到文件名前面的斜线了吗?


有什么我可以做的吗?我只是将它写入桌面上的一个简单文件夹,没有什么特别的。 - Itzik984
4
尝试删除开头的'/'。 - Asherah
3
就像Len所说的那样。移除路径开头的斜杠“/”。 - David Robinson

7

当我使用'shutil.copyfile'而不是'shutil.copy'时,我遇到了这个问题。权限被搞乱了。


2
我遇到了同样的问题。在我的情况下,用户没有写入目标目录的权限。以下命令在我的情况下有所帮助:

最初的回答:
chmod 777 University

1
这并不会给用户写入权限,而是给系统上的每个人所有权限;读取、写入和执行。我建议您查看用户组和权限,而不是像这样打开您的文件夹! - Nander Speerstra
1
完全同意。这就是我提到“在我的情况下”几次的原因。需要将Ubuntu EC2中的应用程序授予特定文件夹的777权限。此外,解决方案的方法可以从块所有或允许所有的方法开始,然后进行优化;这取决于具体情况。 - Sukhi

1

对我来说,以上所有方法都没有起作用。所以我通过这种解决方法解决了我的问题。只需检查您是否在目录文件夹中添加了SYSTEM即可。希望能帮助到某人。

import os
# create file
@staticmethod
def create_file(path):
    if not os.path.exists(path):
        os.system('echo # > {}'.format(path))

# append lines to the file
split_text = text_file.split('\n')
    for st in split_text:
        os.system('echo {} >> {}'.format(st,path))

1

请检查您是否在云驱动器(如Box、Dropbox等)内实现代码。如果您将要实现的文件复制到本地计算机上的文件夹中,那么应该能够消除错误。


想知道这会对它产生什么影响?我遇到了这个错误,而且文件在挂载的 Google Drive 上(Google Drive 文件流)。 - Aedam

1
也许您正在尝试使用with open打开文件夹,请检查一下。

1
你说的“check it once”是什么意思? - Gulzar

0

对我来说,这是一个权限问题。

在特定文件夹上使用“获取所有权”应用程序。然而,这有时似乎只是暂时有效,不是永久性的解决方案。


0

我之所以出现这个错误,是因为该目录尚不存在。

解决方案:创建该目录。

import os
if not os.path.exists(directory):
    os.makedirs(directory)

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