python 权限错误:[错误13]权限被拒绝(在文件中多次成功写入尝试后)

h9a6wy2h  于 2023-09-29  发布在  Python
关注(0)|答案(5)|浏览(177)

我写了一个代码,查询一个mongo数据库,并将结果写入一个文件。我的代码创建了这个文件并开始写入它成功。但是在多次迭代之后(不确定迭代次数是否固定),我得到了一个PermissionError
我已经搜索过了,但我只找到了关于第一次尝试时出错的人的答案,因为他们没有权限。我会精确地说,我没有在我的电脑上做任何事情,在执行过程中,所以我真的不明白它是如何发生的。

以下是部分代码:

def query(self, query_date_part, query_actKey_part, filepath):
    empty = True
    print("0.0 %")
    for i in range(len(query_date_part)):
        query = {"dt": query_date_part[i], "actKey": query_actKey_part}
        cursor = self.collection.find(query)
        while cursor.alive:
            try:
                if empty:
                    with open(filepath, 'w') as fp:
                        json.dump(cursor.next(), fp, default=json_util.default)
                        empty = False
                else:
                    append_to_json(filepath, cursor.next())
            except StopIteration:
                print("Stop Iteration")
        print(str(round(float(i+1) / len(query_date_part) * 100, ndigits=2)) + " %")
    return 0
def append_to_json(filepath, data):
    """
    Append data in JSON format to the end of a JSON file.
    NOTE: Assumes file contains a JSON object (like a Python dict) ending in '}'.
    :param filepath: path to file
    :param data: dict to append
    """
    # construct JSON fragment as new file ending
    new_ending = ", " + json.dumps(data, default=json_util.default)[1:-1] + "}\n"
    # edit the file in situ - first open it in read/write mode
    with open(filepath, 'r+') as f:
        f.seek(0, 2)        # move to end of file
        index = f.tell()    # find index of last byte
        # walking back from the end of file, find the index
        # of the original JSON's closing '}'
        while not f.read().startswith('}'):
            index -= 1
            if index == 0:
                raise ValueError("can't find JSON object in {!r}".format(filepath))
            f.seek(index)
        # starting at the original ending } position, write out
        # the new ending
        f.seek(index)
        f.write(new_ending)`

部分输出:

6.75 %
Stop Iteration
6.76 %
Traceback (most recent call last):
    File "C:/Users/username/PycharmProjects/mongodbtk/mquerytk.py", line 237, in <module>
        mdbc.query(split_date(2017,5,6,1,0,2017,5,16,10,0,step=2), {"$in": ["aFeature"]}, 'test.json')
    File "C:/Users/username/PycharmProjects/mongodbtk/mquerytk.py", line 141, in query
        append_to_json(filepath, cursor.next())
    File "C:/Users/username/PycharmProjects/mongodbtk/mquerytk.py", line 212, in append_to_json
        with open(filepath, 'r+') as f:
PermissionError: [Errno 13] Permission denied: 'test.json'
Process finished with exit code 1

**注意:**文件大小在执行过程中会增加。当它崩溃它是大约300莫,我仍然有很多空间在我的硬盘驱动器,但也许文件的大小可以是一个问题?
**配置:**我使用Windows 7,Python 3.6,IDE为PyCharm Community Edition 2016.3.2

k3bvogb1

k3bvogb11#

我也遇到了同样的问题,在测试之后,当试图太“频繁”地写入同一个文件时,似乎可能会有一些“bug”,每秒多次。我将提供一个非常小的代码片段,您可以使用它进行测试:

import csv

text = "dfkjghdfkljghflkjghjkdfdfgsktjgrhsleiuthsl uirghuircbl iawehcg uygbc sgygerh"
FIELD_NAMES = ['asd', 'qwe']

with open('test.txt', 'w', newline='') as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=FIELD_NAMES)
    writer.writeheader()

max = 10000
i = 0

while i <= max:
    print(str(i))
    with open('test.txt', 'a', newline='') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=FIELD_NAMES)
        rowData = {'asd': text, 'qwe': text}
        writer.writerow(rowData)
    i += 1

我认为代码是非常自我解释的。我得到的错误非常随机,有时它发生在~ 75次迭代之后,有时甚至可以达到~750,但看起来代码无法达到极限。因此,我建议您尝试多次写入更多数据,而不是经常写入少量数据。我希望能帮上忙。

jfewjypa

jfewjypa2#

试试这个

except StopIteration:
    if not fp.closed: fp.close()
    print("Stop Iteration")
nr9pn0ug

nr9pn0ug3#

这似乎是一种竞争条件。创建一个助手函数,它执行与引发竞争条件的函数相同的任务,这对我来说是可行的。例如,如果一个代码块或函数A()正在创建一个竞态条件,那么我们可以通过再次调用另一个助手函数A_helper()来处理这个异常,它也做同样的事情。Python代码示例:

try:
   A()
except PermissionError:
   # Do something
else:
   A_helper()
kqlmhetl

kqlmhetl4#

尝试使用

chmod 755 file.extension

参见:Permission Eerrno13

rqdpfwrv

rqdpfwrv5#

您的文件位于程序无法访问的位置。尝试将其移动到其他目录。或者你可能输入了错误的文件路径。我希望这对你有用!

相关问题