2016-05-05 13 views
0

Ich bin neu bei Python und versuche, ein Programm zu schreiben, das eine Menge Geld, Zahlen oder was auch immer verfolgt. Sie können zu Ihrem Betrag hinzufügen oder subtrahieren, und es wird in einer Datei gespeichert, oder überprüfen Sie die Menge, die Sie derzeit haben. Ich hatte es funktioniert mit diesem CodePython 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) 

Dies funktioniert gut, die Datei ordnungsgemäß geladen wurde, war alles gut, bis heute (etwa 24 Stunden später), wenn ich versuchte es noch einmal, dieses Programm auszuführen, versucht das laden Strommenge, und es gab mir diesen Fehler:

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' 

ich habe dann versucht, die os.chmod Funktion, aber ich bin nicht 100% sicher, dass ich es richtig verwendet wird.

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) 

es schien ich hinter dem Berechtigungsproblem bekam chmod verwenden, aber dann bekam ich diese Fehlermeldung, wenn zu laden versuchen, addieren oder subtrahieren.

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) 

Nicht sicher, ob ich die chmod Funktion nicht richtig verwende oder was. Kann mir jemand sagen, wie ich das beheben kann und/oder warum es aufgehört hat zu arbeiten?

Antwort

0

Berechtigungen nicht automatisch ändern. Das ist weder hilfreich noch notwendig.

Zuerst sortieren Sie Ihr aktuelles Berechtigungsproblem aus. Sie können mit einem anderen Namen anstelle von 'Python' beginnen, der völlig unabhängig von Ihrer Anwendung ist und wahrscheinlich mit der Python-Binärdatei verwechselt wird. Wie wäre es mit 'amount.storage'? Wenn nötig (und nur falls notwendig, was nicht standardmäßig ist), verwenden Sie ls und chmod (in der Befehlszeile, nicht in Ihrem Programm), um die Berechtigungen zu sortieren. Wenn Sie Hilfe benötigen, ask at our sister site superuser. Sie können touch amount.storage verwenden, um die Datei zu erstellen, und rm amount.storage (beide in der Befehlszeile nicht in der Python-Shell), um es zu löschen.

Danach stellen Sie sicher, dass Sie Ihre Datei korrekt öffnen. Da Sie es mehrere Male tun, lohnt es sich, functions zu haben, so dass Sie Ihren Code nicht kopieren und einfügen müssen. Beginnen wir mit der Ladefunktion starten:

import pickle 

FILENAME = "amount.storage" 

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

Durch eine with statement verwenden, stellen wir sicher, die Datei selbst wenn ein Fehler auftritt, zu schließen. Apropos Fehler, wir sollten die Datei definitiv nicht behandeln. Fügen wir eine 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 

Sparen ist dann leicht; Öffnen Sie mit dem Modus wb:

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

Nun, da wir diese Helferfunktionen bekam, lasst sie uns in dem gesamten Programm verwenden:

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) 

Beachten Sie, dass Sie den gesamten Code durch Entfernen Sie kopiert und eingefügt, dieses neue Programm ist viel einfacher zu folgen und viel einfacher zu ändern.

Abgesehen von mehr Operationen könnte einer der nächsten Schritte auch sein, Pickle zu vermeiden, was eine potentielle Sicherheitslücke öffnet, indem jeder, der in die Datei schreiben kann, beliebigen Python-Code injizieren kann. Wie wäre es mit json?Alles, was Sie tun müssen, ist die drei Instanzen von pickle oben mit json ersetzen und die Speicherdatei einmal/namen es amount.json, als sein aktueller Zustand eine gültige JSON-Datei wird nicht gelöscht werden. Ein Plus wäre, dass JSON menschenlesbar ist; Das Codieren einer Zahl führt einfach dazu, dass die Zahl als eine für Menschen lesbare Zeichenfolge (und nichts mehr) in die Datei geschrieben wird.