Salvesen. Skrevet 13. juni 2014 Del Skrevet 13. juni 2014 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
Lycantrophe Skrevet 13. juni 2014 Del Skrevet 13. juni 2014 (endret) 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 13. juni 2014 av Lycantrophe 1 Lenke til kommentar
snippsat Skrevet 13. juni 2014 Del Skrevet 13. juni 2014 (endret) 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 13. juni 2014 av snippsat Lenke til kommentar
Salvesen. Skrevet 16. juni 2014 Forfatter Del Skrevet 16. juni 2014 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
Cemi Skrevet 16. juni 2014 Del Skrevet 16. juni 2014 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
Salvesen. Skrevet 16. juni 2014 Forfatter Del Skrevet 16. juni 2014 "Syntax error: There's an error in your program: invalid syntax" så blir første open markert. Lenke til kommentar
Cemi Skrevet 16. juni 2014 Del Skrevet 16. juni 2014 Det første som kommer opp på google ved et søk er at du kanskje har en gammel versjon av python, eventuelt flere versjoner installert. Ville sjekket hvilken versjon du har, også sett om en eventuell oppgradering kan ordne det. http://stackoverflow.com/questions/2685097/syntax-error-when-using-with-open-in-python-python-newbie Lenke til kommentar
snippsat Skrevet 16. juni 2014 Del Skrevet 16. juni 2014 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
Salvesen. Skrevet 16. juni 2014 Forfatter Del Skrevet 16. juni 2014 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
snippsat Skrevet 16. juni 2014 Del Skrevet 16. juni 2014 (endret) 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 16. juni 2014 av snippsat Lenke til kommentar
Salvesen. Skrevet 16. juni 2014 Forfatter Del Skrevet 16. juni 2014 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
snippsat Skrevet 16. juni 2014 Del Skrevet 16. juni 2014 (endret) 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 16. juni 2014 av snippsat Lenke til kommentar
Salvesen. Skrevet 16. juni 2014 Forfatter Del Skrevet 16. juni 2014 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
Salvesen. Skrevet 17. juni 2014 Forfatter Del Skrevet 17. juni 2014 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
snippsat Skrevet 18. juni 2014 Del Skrevet 18. juni 2014 (endret) 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 18. juni 2014 av snippsat Lenke til kommentar
Salvesen. Skrevet 18. juni 2014 Forfatter Del Skrevet 18. juni 2014 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
Lycantrophe Skrevet 18. juni 2014 Del Skrevet 18. juni 2014 Støtter ikke windows-konsollen ansi/xterm codes? :-/ Lenke til kommentar
snippsat Skrevet 18. juni 2014 Del Skrevet 18. juni 2014 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
Salvesen. Skrevet 12. august 2014 Forfatter Del Skrevet 12. august 2014 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
Lycantrophe Skrevet 12. august 2014 Del Skrevet 12. august 2014 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå