Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我会得到;[ERRNO13]权限被拒绝:“;连续进行开放和写入呼叫时?_Python_Json_File Permissions_Codec_File Writing - Fatal编程技术网

Python 为什么我会得到;[ERRNO13]权限被拒绝:“;连续进行开放和写入呼叫时?

Python 为什么我会得到;[ERRNO13]权限被拒绝:“;连续进行开放和写入呼叫时?,python,json,file-permissions,codec,file-writing,Python,Json,File Permissions,Codec,File Writing,更新 它现在通过直接调用抛出错误,并且在关系文档中。我完全摆脱了write_el(),只需这样做: ... if el["doc_type"] == "node": with codecs.open((fo_pre+"_nodes.json"), mode) as fo: fo.write(json.dumps(el, indent=2)+"\n") ... 另外,应该注意的是,XML文档(

更新

它现在通过直接调用抛出错误,并且在关系文档中。我完全摆脱了
write_el()
,只需这样做:

...
if el["doc_type"] == "node":
    with codecs.open((fo_pre+"_nodes.json"), mode) as fo:
        fo.write(json.dumps(el, indent=2)+"\n")
...
另外,应该注意的是,XML文档(OSM)首先包含所有节点元素,然后是方式元素,然后是关系元素

原创帖子

我正在使用
codecs.open
JSON.dumps
从Python
xml.etree.ElemenTree.iterparse
中写入多个JSON文件。我调用一个单独的函数来写入文件

这适用于某些元素/文档,但不是所有元素/文档。它只写了这么多,然后以
权限错误停止:[Errno 13]权限被拒绝:
。对file write方法的最后一次调用返回207,但前面的许多调用也返回207。下一个元素看起来很正常:

<!--Last element written to JSON file.-->
  <node id="7898832843" lat="48.7888301" lon="-122.5067978" version="1" timestamp="2020-09-11T22:37:30Z" changeset="90779671" uid="10612244" user="mapstuffs"/>

<!--Next element, not written to JSON file.-->
  <node id="7898832844" lat="48.7888177" lon="-122.5058429" version="1" timestamp="2020-09-11T22:37:30Z" changeset="90779671" uid="10612244" user="mapstuffs"/>
返回

PermissionError: [Errno 13] Permission denied: 'test_bham_nodes.json'

多亏了一些评论者,我发现在
iterparse()
之外使用open()嵌套

我的防病毒程序可能是罪魁祸首,每次关闭文件时都会访问该文件,这偶尔会在下一次文件打开操作时导致访问冲突

由于操作成本的原因,我不喜欢打开和关闭每个元素的文件,我最初是在写入单个文件时从打开的文件中解析XML的。但是,当我决定写入多个文件时,我不想为我想从中写入的每个JSON文件重新解析XML

现在看起来似乎不需要动脑筋,但嵌套文件可以打开并保存计算。如果你想写很多文件,它可能会增加缩进,但这就是生活

def process_map(file_in, fo_pre, mode = "a"):
    
    with codecs.open(fo_pre+"_nodes.json", mode) as nd_fo, \
    codecs.open(fo_pre+"_ways.json", mode) as wy_fo, \
    codecs.open(fo_pre+"_relations.json", mode) as rl_fo:

        for _, element in ET.iterparse(file_in):
                el = shape_element(element)
                if el:
                    if el["doc_type"] == "node":
                        write_el(el=el, file_out=fo_pre+"_nodes.json",
                                 mode=mode)
                    elif el["doc_type"] == "way":
                        write_el(el=el, file_out=fo_pre+"_ways.json",
                                 mode=mode)
                    elif el["doc_type"] == "relation":
                        write_el(el=el, file_out=fo_pre+"_relations.json",
                                 mode=mode)

    return

因为你没有访问该文件的权限。您应该在操作系统级别上检查文件和/或目录的权限……也就是说,如果您只打开一个文件描述符,而不重新打开文件,则不会进行进一步的权限检查。无论如何,一遍又一遍地重新打开某个文件是非常慢的。为什么每次要编写单个元素时都要重新打开该文件?在写任何东西之前只打开它一次,然后在完全完成后才关闭它,这会更快、更可靠。你是否有一个病毒扫描程序,在每次你扫描新文件时关闭它,它都会让你的文件被使用?它可能是诺顿。Jupyter不必只打开它来更新一个不需要缩进的目录,您可以用一个
打开多个项目。看见
def process_map(file_in, fo_pre, mode = "a"):
    
    with codecs.open(fo_pre+"_nodes.json", mode) as nd_fo, \
    codecs.open(fo_pre+"_ways.json", mode) as wy_fo, \
    codecs.open(fo_pre+"_relations.json", mode) as rl_fo:

        for _, element in ET.iterparse(file_in):
                el = shape_element(element)
                if el:
                    if el["doc_type"] == "node":
                        write_el(el=el, file_out=fo_pre+"_nodes.json",
                                 mode=mode)
                    elif el["doc_type"] == "way":
                        write_el(el=el, file_out=fo_pre+"_ways.json",
                                 mode=mode)
                    elif el["doc_type"] == "relation":
                        write_el(el=el, file_out=fo_pre+"_relations.json",
                                 mode=mode)

    return