Gå til innhold

Anbefalte innlegg

Hei,

 

Jeg er helt ny til python og programmering egentlig(foruten ladder og fbd). Holder nå på å tester litt i python. Det jeg vill gjøre er å ha ett dictionary med datoer og navn og så sjekke om noen av datoene i dictionaryet er på den aktuelle dagen jeg kjører scriptet. Vill også ha mulighet til å legge til navn/datoer til dictionaryet. Dette er greit og det fungerer nå.

 

Men når jeg stopper å kjøre scriptet forsvinner de navnene/datoene jeg har oppdatert dictionaryet med. Hvordan lagrer jeg dette slik at det ligger der neste gang jeg kjører? Skrive det til lokal fil?

 

Setter pris på om noen vet om en guide på hvordan en gjør dette eller lignende. Vet hvordan man skriver til fil men usikker på hvordan det blir med dict.

Lenke til kommentar
Videoannonse
Annonse

Skriv til lokal fil.

 

writer = csv.writer(open('dict.csv', 'wb'))
for key, value in mydict.items():
   writer.writerow([key, value])
reader = csv.reader(open('dict.csv', 'rb'))
mydict = dict(x for x in reader)
Antar at du ikke trenger conversions.

 

http://stackoverflow.com/questions/8685809/python-writing-a-dictionary-to-a-csv-file-with-one-line-for-every-key-value

Endret av Lycantrophe
  • Liker 1
Lenke til kommentar

Alternative er er bruke er "serialization format" som Pickle, JSON.

Vil anbefale JSON som er mye brukt og raskere enn Pickle.

Fordelen er at dictionaryet holder seg intakt når du skriver og leser fra lokal fil.

import json

record = {"hans": "2010-01-01", 'grete': "2014-01-01"}
with open("my_file", "w") as my_file:
    json.dump(record, my_file)
with open("my_file") as saved_file:
    saved_record = json.load(saved_file)

print saved_record
#--> {u'hans': u'2010-01-01', u'grete': u'2014-01-01'}
Endret av snippsat
Lenke til kommentar

 

Alternative er er bruke er "serialization format" som Pickle, JSON.

Vil anbefale JSON som er mye brukt og raskere enn Pickle.

Fordelen er at dictionaryet holder seg intakt når du skriver og leser fra lokal fil.

import json

record = {"hans": "2010-01-01", 'grete': "2014-01-01"}
with open("my_file", "w") as my_file:
    json.dump(record, my_file)
with open("my_file") as saved_file:
    saved_record = json.load(saved_file)

print saved_record
#--> {u'hans': u'2010-01-01', u'grete': u'2014-01-01'}

 

Hei,

 

Holder på å teste litt med dette for å se hva som er best løsning, men når jeg bruker denne koden(direkte) får jeg syntax feil på "open"?

Lenke til kommentar

Hei,

 

Holder på å teste litt med dette for å se hva som er best løsning, men når jeg bruker denne koden(direkte) får jeg syntax feil på "open"?

 

Jeg får ingen feil når jeg bare kopierer koden og bygger den. Hva er feilmeldingen?

Lenke til kommentar
Det første som kommer opp på google ved et søk er at du kanskje har en gammel versjon av python

 

Det er nok heller en nyere versjon,ville vært litt rart om en ny bruker av Python skulle bruke 2.5(kom ut i 2006).

"Syntax error: There's an error in your program: invalid syntax"

 

Bruker du Pyhon 3,forandrer du siste linjen til print(saved_record).

I Python 3 har print blitt en funksjon.

Post alltid hele "Traceback" melding,da hadde dette vært klart hva som er feil.

Lenke til kommentar

 

Det første som kommer opp på google ved et søk er at du kanskje har en gammel versjon av python

 

Det er nok heller en nyere versjon,ville vært litt rart om en ny bruker av Python skulle bruke 2.5(kom ut i 2006).

"Syntax error: There's an error in your program: invalid syntax"

 

Bruker du Pyhon 3,forandrer du siste linjen til print(saved_record).

I Python 3 har print blitt en funksjon.

Post alltid hele "Traceback" melding,da hadde dette vært klart hva som er feil.

 

 

Jeg bruker 2.5.4 og får ikke noe traceback melding. Jeg får kun en popup med det har skrevet og så blir "open" markert rød i koden.

Lenke til kommentar
Jeg bruker 2.5.4 og får ikke noe traceback melding

 

Det får du Python gir alltid hele "Traceback",kan være editoren du bruker som du må lete litt i.

Hvorfor bruker du en 8-år gammel versjon?

 

import json kom ut i Python 2.6

Med python 2.5 må du bruke simplejson 3.5.2

Med import som ser sånn ut import simplejson as json

Endret av snippsat
Lenke til kommentar

 

Jeg bruker 2.5.4 og får ikke noe traceback melding

 

Det får du Python gir alltid hele "Traceback",kan være editoren du bruker som du må lete litt i.

Hvorfor bruker du en 8-år gammel versjon?

 

import json kom ut i Python 2.6

Med python 2.5 må du bruke simplejson 3.5.2

Med import som ser sånn ut import simplejson as json

 

 

hm, jeg finner ikke noe traceback iallefall, hvordan kan jeg lete? Editoren er helt tom, foruten versjon informasjon og slikt som alltid kommer først.

 

Tror det er pga jeg såg noen MIT forelesninger på nett og der brukte de denne versjonen om jeg ikke tar helt feil. Hvilken versjon burde jeg bruke?

Lenke til kommentar
Tror det er pga jeg såg noen MIT forelesninger på nett og der brukte de denne versjonen om jeg ikke tar helt feil.

Ja men det betyr overhode ikke at du skal bruke samme gamle versjon.

Alt som virker i Ptyhon 2.5 virker også Python 2.7,det er bare Python 3 som har brutt bakoverkompatibel.

Hvilken versjon burde jeg bruke?

Python 2.7.7

 

Editoren er helt tom,

 

Hvilken editor?

Python gir alltid beskjed om linje nummer hvor feil har skjedd.

>>> a
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
NameError: name 'a' is not defined
Endret av snippsat
Lenke til kommentar

 

Tror det er pga jeg såg noen MIT forelesninger på nett og der brukte de denne versjonen om jeg ikke tar helt feil.

Ja men det betyr overhode ikke at du skal bruke samme gamle versjon.

Alt som virker i Ptyhon 2.5 virker også Python 2.7,det er bare Python 3 som har brutt bakoverkompatibel.

Hvilken versjon burde jeg bruke?

Python 2.7.7

 

Editoren er helt tom,

 

Hvilken editor?

Python gir alltid beskjed om linje nummer hvor feil har skjedd.

>>> a
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
NameError: name 'a' is not defined

 

 

Helt enig, gikk bare ut i fra at jeg hadde nyeste versjon da forelesningen var fra i fjor eller noe slikt. Viste bare at v3 var noe anderledels.

 

Har nå lastet ner 2.7.7 og det fungerer så takker så mye :)

Lenke til kommentar

 

Alternative er er bruke er "serialization format" som Pickle, JSON.

Vil anbefale JSON som er mye brukt og raskere enn Pickle.

Fordelen er at dictionaryet holder seg intakt når du skriver og leser fra lokal fil.

import json

record = {"hans": "2010-01-01", 'grete': "2014-01-01"}
with open("my_file", "w") as my_file:
    json.dump(record, my_file)
with open("my_file") as saved_file:
    saved_record = json.load(saved_file)

print saved_record
#--> {u'hans': u'2010-01-01', u'grete': u'2014-01-01'}

 

Har satt opp en test funksjon med dette:

import json
with open("my_file") as saved_file:
        record = json.load(saved_file)
        
record = {}
print record
restart = raw_input("Do you want to restart program?")
while restart == "yes":
    print record
    name = raw_input("Whats your name?")
    date = raw_input("Whats your birthdate?")
    record.update({name:date})
    with open("my_file", "w") as my_file:
        json.dump(record, my_file)
    stopp = raw_input("do you want to stop?")
    if stopp == "yes":
        restart = 0
    else:
        pass

Men dette virker ikke helt. Først så fungerte det når jeg kjørte, men når jeg restartet det så fikk jeg ikke noe data fra sist gang jeg kjørte det. Slettet så filen "my_file" for jeg hadde to(en txt og en csv) og lagde så en csv fil, men nå får jeg denne traceback`en

Traceback (most recent call last):
  File "C:\Users\6603\Desktop\Personlig\python\dict test\dict_test.py", line 2, in <module>
    with open("my_file") as saved_file:
IOError: [Errno 2] No such file or directory: 'my_file'

Har prøvd med både .csv og .txt fil lagret som "my_file" men det ser ikke ut til å fungere noe av det.

Hva gjør jeg feil og hva er feil i koden i og med at det ikke lagrer seg og så loader inn i dict. når jeg restarter?

 

sikkert en tullekode for dere som kan det men som sagt så er jeg veldig fersk :)

Lenke til kommentar
Har satt opp en test funksjon med dette:

For er oppgave som dette bør du prøve og strukturer koden bedre.

Funksjoner vil funger fint her,gjør koden lettere og lese/teste.

Utvide koden blir også et mareritt viss du skriver alt koden i "global space".

For og vise med et eksempel.

import json

def showoptions():
    print "1: Make new record"
    print "2: Look at saved record"
    print "Q: quit\n"

def show_result():
    try:
        with open("my_file.json") as a_file:
            saved_record = json.load(a_file)
            return saved_record
    except IOError:
        return 'No record found\n'

def save_record():
    record = {}
    stop = ''
    while stop != 'quit':
        name = raw_input("Whats your name?")
        date = raw_input("Whats your birthdate?")
        stop = raw_input("<enter> continue <quit> stop record")
        record.update({name:date})
    with open("my_file.json", "w") as my_file:
        json.dump(record, my_file)

def main():
    while True:
        showoptions()
        choice = raw_input('Enter your choice: ').lower()
        if choice == '1':
            save_record()
        elif choice == '2':
            print '{}\n'.format(show_result())
        elif choice.lower() == 'q':
            return False
        else:
            print('Not a correct choice: {}'.format(choice))

if __name__ == '__main__':
    main()

Med funksjoner som her kan du lettere bygge koden.

Som f.eks en uppdate funksjon.

Nå kan den bare lage ny record,og se på lagret record.

Men dette virker ikke helt. Først så fungerte det når jeg kjørte, men når jeg restartet det så fikk jeg ikke noe data fra sist gang jeg kjørte det. Slettet så filen "my_file" for jeg hadde to(en txt og en csv) og lagde så en csv fil, men nå får jeg denne traceback`en

Du trenger ikke fil-endelse,skal du bruke noe så er det så er ".json" du skal bruke.

Du må lese litt om "serialization format" som er noe annet enn (txt og csv).

Endret av snippsat
Lenke til kommentar

 

Har satt opp en test funksjon med dette:

For er oppgave som dette bør du prøve og strukturer koden bedre.

Funksjoner vil funger fint her,gjør koden lettere og lese/teste.

Utvide koden blir også et mareritt viss du skriver alt koden i "global space".

For og vise med et eksempel.

 

 

Er helt enig i at strukturen i eksempelet var dårlig, men det var bare noe jeg slengte sammen for å se at jeg kunne skrive til fil og hente ut igjen. Dette er ikke en del av koden til "prosjektet" mitt. endte opp med å bruke reader/writer forslaget til Lycantrophe. Fungerer fint så langt :)

 

Men takk for tips! Er nok en del jeg kan lære fra det eksempelet!

 

Prøver å finne ut hvordan man skriver strings i forskjellige farger nå men det var neimen meg ikke lett om man sidder på Windows!

Lenke til kommentar
Windows-konsollen støtter ikke ANSI nativ,som Linux.
Colorama gjør noen krumspring for og få dette til og fungere.

ANSI escape character sequences have long been used to produce colored terminal
text and cursor positioning on Unix and Macs. Colorama makes this work on
Windows, too, by wrapping stdout, stripping ANSI sequences it finds (which
otherwise show up as gobbledygook in your output), and converting them into the
appropriate win32 calls to modify the state of the terminal. On other platforms,
Colorama does nothing.

 

Har også sett diverse ctypes hack,som gir farge til Windows-konsollen.

Lenke til kommentar
  • 1 måned senere...

Hei igjen,

 

Har kommet over ett nytt problem nå. Det har seg slik at noen av verdiene er like, så når jeg skriver til dict. blir ikke de som er like med. Altså jeg sitter igjen med ett dict. på drøyt 350 mens dokumentet er nærmere 600.

 

hvordan får jeg med alt? eksempel på hvordan teksten jeg skal lagre ser ut:

 

AS-11111,AS-35035

AS-11111,AS-35022

AS.11111,AS-30020

 

osv...

 

Bruker forøvrig denne løsningen i dag:

reader = csv.reader(open('dict.csv', 'rb'))
mydict = dict(x for x in reader)
Lenke til kommentar

La verdiene i dicten være arrays i stedet for plain values.

 

Når du skriver til fil kan du bruke CSV men tillat flere nøkler (må ta hensyn til ved lesing) og skriv hvert elemenet i arrayen som key,value (og samme når du leser).

 

Alternativet er å bruke et serialiseringsformat som støtter slike ting direkte. JSON er et eksempel.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...