繁体   English   中英

为什么在连续进行打开和写入调用时会收到“[Errno 13] Permission denied:”?

[英]Why am I getting "[Errno 13] Permission denied:" when making consecutive open and write calls?

更新

它现在通过直接调用和关系文档抛出错误。 我完全摆脱了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.openjson.dumps从 Python xml.etree.ElemenTree.iterparse写入多个 JSON 文件。 我调用一个单独的函数来写入文件。

这适用于某些元素/文档,但不是全部。 它只PermissionError: [Errno 13] Permission denied: <file name>然后停止PermissionError: [Errno 13] Permission denied: <file name> 对文件写入方法的最后一次调用返回 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"/>

另外,每次我尝试时,它都会在不同的元素上抛出错误。 而且,它有时不会抛出错误。

精简 Python:

import xml.etree.ElementTree as ET
import codecs
import json

def write_el(el, file_out, mode = "a"):
    with codecs.open(file_out, mode) as fo:
        fo.write(json.dumps(el, indent=2)+"\n")
    return

def process_map(file_in, fo_pre, mode = "a"):
    
    for _, element in ET.iterparse(file_in):
        # shape_element() formats XML elements into JSON-compatible Python
        # dictionaries and lists.
        el = shape_element(element)
        if el:
            if el["doc_type"] == "node":
# Calling open/write directly works.
#                 with codecs.open(fo_pre+"_nodes.json", mode) as fo:
#                     fo.write(json.dumps(el, indent=2)+"\n")
# But, calling write_el for this doc_type throws permission error
# halfway through the document. The element following the last written looks
# just fine.
                write_el(el=el, file_out=fo_pre+"_nodes.json", mode=mode)
# Calling write_el works fine for the other doc_types, if error not thrown
# from previous block first.
            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, write=write, pretty=pretty)
                
def test():
    process_map(file_in=filename, fo_pre="test_bham", write=True)

    return

test()

退货

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

感谢一些评论者,我发现在iterparse()之外with open()嵌套with open()

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

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

现在看起来很简单,但嵌套文件打开工作并节省计算。 如果你想写很多文件,它可能会建立缩进,但是 c'est la vie。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM