Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.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 Pickle文件权限_Python_Python 3.x_Pickle - Fatal编程技术网

Python Pickle文件权限

Python Pickle文件权限,python,python-3.x,pickle,Python,Python 3.x,Pickle,我是python新手,正在尝试编写一个程序来跟踪金额、数字或其他信息。您可以添加或减去您的金额,并将其保存到文件中,或者检查您当前拥有的金额。我让它用这个代码工作 import pickle num = 0 toDo = input("would you like to load or add/subtract? ") if toDo == "add": a = float(input("How much do you want to add? ")) pic

我是python新手,正在尝试编写一个程序来跟踪金额、数字或其他信息。您可以添加或减去您的金额,并将其保存到文件中,或者检查您当前拥有的金额。我让它用这个代码工作

  import pickle

  num = 0
  toDo = input("would you like to load or add/subtract? ")

  if toDo == "add":
    a = float(input("How much do you want to add? "))
    pickle_in = open("Python", "rb")
    newNum = pickle.load(pickle_in)
    newNum = newNum + a
    print("Current balance:", newNum)
    pickle_out = open("Python","wb")
    pickle.dump(newNum, pickle_out)
    pickle_out.close()

  if toDo == "subtract":
    a = float(input("How much do you want to subtract? "))
    pickle_in = open("Python", "rb")
    newNum = pickle.load(pickle_in)
    newNum = newNum - a
    print("Current balance:", newNum)
    pickle_out = open("Python","wb")
    pickle.dump(newNum, pickle_out)
    pickle_out.close()


  if toDo == "load":
    pickle_in = open("Python", "rb")
    newNum = pickle.load(pickle_in)
    print("Current balance:", newNum)
这工作正常,文件加载正常,一切都很好,直到今天(大约24小时后),我再次尝试运行此程序,试图加载当前数量,但它给了我以下错误:

Traceback (most recent call last):
  File "C:\Users\Dom\Desktop\amount.py", line 34, in <module>
    pickle_in = open("Python", "rb")
PermissionError: [Errno 13] Permission denied: 'Python'
似乎我使用chmod解决了权限问题,但在尝试加载、添加或删除时出现了此错误

Traceback (most recent call last):
  File "C:\Users\Dom\Desktop\amount.py", line 11, in <module>
    pickle_in = os.chmod("Python", "rb")
TypeError: an integer is required (got type str)
回溯(最近一次呼叫最后一次):
文件“C:\Users\Dom\Desktop\amount.py”,第11行,在
pickle_in=os.chmod(“Python”、“rb”)
TypeError:需要一个整数(获取类型str)

不确定我是否没有正确使用chmod函数或什么。有人能告诉我如何修复此问题和/或它停止工作的原因吗?

不要自动更改权限。这既没有帮助也没有必要

首先,解决您当前的权限问题。您可以从使用另一个名称开始,而不是使用
“Python”
,这与您的应用程序完全无关,并且可能与Python二进制文件混淆。“金额.存储”怎么样?如有必要(且仅在必要时,默认情况下并非如此),使用
ls
chmod
(在命令行中,而不是在程序中)来排序权限。如果你需要这方面的帮助。您可以使用
touch amount.storage
尝试创建该文件,并使用
rm amount.storage
(都在命令行中,而不是在Python shell中)删除该文件

之后,确保正确打开文件。因为您已经做了很多次了,所以这样做是值得的,这样您就不需要复制和粘贴代码了。让我们从加载函数开始:

import pickle

FILENAME = "amount.storage"

def load():
    with open(FILENAME, "rb") as f:
        return pickle.load(f)
通过使用,即使发生错误,我们也确保关闭文件。说到错误,我们应该非常明确地处理不存在的文件。让我们添加一个:

储蓄是很容易的;以模式
wb
打开:

def save(amount):
    with open(FILENAME, "wb") as f:
        pickle.dump(amount, f)
现在我们有了这些帮助函数,让我们在整个程序中使用它们:

import pickle

FILENAME = "amount.storage"


def load():
    try:
        with open(FILENAME, "rb") as f:
            return pickle.load(f)
    except FileNotFoundError:
        return 0  # start with 0 if no storage present


def save(amount):
    with open(FILENAME, "wb") as f:
        pickle.dump(amount, f)


num = load()
toDo = input("would you like to load or add/subtract? ")

if toDo == "add":
    a = float(input("How much do you want to add? "))
    newNum = num + a
    save(newNum)
elif toDo == "subtract":
    a = float(input("How much do you want to subtract? "))
    newNum = num - a
    save(newNum)
else:
    newNum = num

print("Current balance:", newNum)
请注意,通过删除复制和粘贴的所有代码,这个新程序更容易遵循,也更容易更改

除了更多操作之外,下一步还可以避免pickle,它允许任何可以写入文件的人注入任意Python代码,从而打开了一个潜在的安全漏洞。相反,你呢?您只需将上面的
pickle
的三个实例替换为
json
,并删除存储文件一次/name它
amount.json
,因为它的当前状态将不是有效的json文件。另外一个好处是JSON是人类可读的;编码一个数字只会导致将该数字作为人类可读的字符串(仅此而已)写入文件

def save(amount):
    with open(FILENAME, "wb") as f:
        pickle.dump(amount, f)
import pickle

FILENAME = "amount.storage"


def load():
    try:
        with open(FILENAME, "rb") as f:
            return pickle.load(f)
    except FileNotFoundError:
        return 0  # start with 0 if no storage present


def save(amount):
    with open(FILENAME, "wb") as f:
        pickle.dump(amount, f)


num = load()
toDo = input("would you like to load or add/subtract? ")

if toDo == "add":
    a = float(input("How much do you want to add? "))
    newNum = num + a
    save(newNum)
elif toDo == "subtract":
    a = float(input("How much do you want to subtract? "))
    newNum = num - a
    save(newNum)
else:
    newNum = num

print("Current balance:", newNum)