2016-05-05 5 views
0

Я новичок в python и пытаюсь написать программу, которая отслеживает количество денег, цифр или что-то еще. Вы можете добавить или вычесть сумму и сохранить ее в файл или проверить сумму, которую вы в настоящее время имеете. Я имел это работает, используя этот кодPython Pickle File Permissions

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' 

затем я попытался с помощью функции os.chmod, но я не 100% уверен, что я использовал его должным образом.

import pickle 
import os, sys, stat 



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 = os.chmod("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 = os.chmod("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 = os.chmod("Python", "rb") 
    newNum = pickle.load(pickle_in) 
    print("Current balance:", newNum) 

казалось, я получил за проблемой разрешения с помощью 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) 

Не уверен, что я не использую функцию chmod правильно или что. Может ли кто-нибудь сказать мне, как исправить это и/или почему он перестает работать?

ответ

0

Нельзя автоматически изменять разрешения. Это не полезно и не нужно.

Прежде всего, устраните проблему с текущим разрешением. Вы можете начать с использования другого имени вместо 'Python', что совершенно не связано с вашим приложением и может быть запущено с бинарником python. Как насчет 'amount.storage'? Если необходимо (и только в случае необходимости, что не по умолчанию), используйте ls и chmod (в командной строке, а не в вашей программе), чтобы сортировать разрешения. Если вам нужна помощь, ask at our sister site superuser. Вы можете использовать touch amount.storage, чтобы попробовать создать файл, и rm amount.storage (оба в командной строке, не в оболочке Python), чтобы удалить его.

После этого обязательно проверьте файл. Поскольку вы делаете это несколько раз, платит functions, поэтому вам не нужно копировать и вставлять код. Давайте начнем с функцией загрузки:

import pickle 

FILENAME = "amount.storage" 

def load(): 
    with open(FILENAME, "rb") as f: 
     return pickle.load(f) 

Используя with statement, мы уверены, чтобы закрыть файл, даже если происходит ошибка. Говоря об ошибках, мы должны определенно обрабатывать файл, который не присутствует. Давайте добавим exception handler:

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

Saving тогда легко; открыть в режиме 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) 

Заметим, что, удаляя все код, который вы скопировали и вставили, эту новую программу намного легче следовать, и намного легче изменить.

Помимо дополнительных операций, одним из следующих шагов может быть отказ от рассола, который открывает потенциальную дыру в безопасности, позволяя любому, кто может писать в файл, вводить произвольный код Python. Вместо этого, как насчет json?Все, что вам нужно сделать, это заменить три экземпляра pickle выше на json и удалить файл хранилища один раз/назовите его amount.json, так как его текущее состояние не будет действительным файлом JSON. Плюсом было бы то, что JSON читается человеком; кодирование числа просто приведет к тому, что число будет записываться в файл как удобочитаемая строка (и ничего более).