python - lägga till ID för varje input i text fil.

Permalänk
Medlem

python - lägga till ID för varje input i text fil.

Hej!

Här har jag gjort ett litet projekt.

import datetime import sys class info: def __init__(self,first_name,last_name): self.first_name = first_name self.last_name = last_name def user(self): time = datetime.datetime.now() c_time = time.strftime("%Y.%m.%d - %H:%M:%S") return c_time + "\n" + \ "Name: " + self.first_name + " " + self.last_name + \ "\n\n" first_name = sys.argv[1] last_name = sys.argv[2] nfo = info(first_name,last_name) f = open("user.txt","a") f.write(nfo.user()) f.close()

Som koder lyder så lägger den in 2 rader i en text fil varje gång man kör den. Det ser ut såhär:

2022.06.03 - 14:36:04 Name: Erik Dahl 2022.06.03 - 14:36:12 Name: Daniel Eriksson 2022.06.03 - 14:36:18 Name: Emil Karlsson

Nu vill jag kunna hämta ut informationen om en specifik person. T.ex Daniel Eriksson.
Hur kan jag lägga till ett ID som ökar varje gång jag kör python skriptet samt hämta all info om en specifik person? (t.ex. om jag lägger till fler rader som email,telefonnummer etc) Antar att jag måste skapa en separat python fil för endamålet? Kasta inte svaret till mig utan försök att lära mig

Tack på förhand.

Permalänk
Medlem

Om jag var dig så skulle jag fundera på hur du formaterar informationen som lagras i user.txt. Som det ser ut nu så returnerar user() en redan formaterad string. Fundera på om du kan spara ett objekt per rad i e.g. en semikolonseparerad fil som skulle kunna se ut enligt följande ("2022.06.03 - 14:36:18;Daniel;Eriksson").

Förslagsvis så kan du läsa in varje rad och separera den på med på ";" med funktionen .split(";"). Varje rad kan du förslagsvis se som ett id, om du inte vill lägga till ett indexvärde direkt i objektet.

Efter detta får du formatera informationen så att du får den output du vill ha.

Lycka till!

Visa signatur

Thinkpad - Ubuntu

Permalänk

Jag håller med ovanstående om att det skulle vara lättare att hämta informationen om du sparade den på ett "bättre" sätt i textfilen. Men angående id:t så skulle du helt enkelt kunna skapa en klass-variabel i info-klassen som du sedan ökar med ett efter varje skrivning och sedan använder i textfilen.

Permalänk
Medlem
Skrivet av simonlol:

Om jag var dig så skulle jag fundera på hur du formaterar informationen som lagras i user.txt. Som det ser ut nu så returnerar user() en redan formaterad string. Fundera på om du kan spara ett objekt per rad i e.g. en semikolonseparerad fil som skulle kunna se ut enligt följande ("2022.06.03 - 14:36:18;Daniel;Eriksson").

Förslagsvis så kan du läsa in varje rad och separera den på med på ";" med funktionen .split(";"). Varje rad kan du förslagsvis se som ett id, om du inte vill lägga till ett indexvärde direkt i objektet.

Efter detta får du formatera informationen så att du får den output du vill ha.

Lycka till!

Har du möjligtvis någon länk jag kan läsa om hur detta skulle kunna se ut?

Tack

Permalänk
Medlem

Jag slår ett trumslag för JSON, välspritt format som kan hanteras av de flesta (om inte alla?) språk

https://www.w3schools.com/python/python_json.asp

Enkelt att konvertera till och från objekt.

Visa signatur

Stationär: Core i9 13900k | Asus X790 ROG Strix Gaming-F | 32GB DDR5 | GeForce RTX 5090 | Lian Li PC-O11 dynamic evo
Laptop: Macbook Pro 16" | Apple M1 Max

Permalänk
Medlem

Kolla på om du kan använda csv, som andra beskriver så är det enkelt att separera med semikolon. Då kan du göra din lista i excel (eller motsvarande) och namnge kollumnerna, sedan sparar du den bara som .csv och använder lämpligt bibliotek i python för detta.
Se här https://docs.python.org/3/library/csv.html#csv.DictReader

Permalänk
Medlem

Tack för era förslag. Ska ta och undersöka detta under helgen

Permalänk
Medlem

Hej igen allihopa. Hur ser detta ut? Har jag förstått json rätt? Hur kan jag lägga till ett ID som öker varje gång jag kör skriptet? Jag antar att jag måste läsa av user.json för att hitta åt det högsta IDt för att sedan plussa på IDt med 1? Tack på förhand.

import json import sys first_name = sys.argv[1] last_name = sys.argv[2] age = sys.argv[3] user = {"firstname":first_name,"lastname":last_name,"age":age} with open("user.json","a") as f: json.dump(user,f,indent=4)

{ "firstname": "Emil", "lastname": "Larsson", "age": "42" }{ "firstname": "Daniel", "lastname": "Karlsson", "age": "20" }{ "firstname": "Erik", "lastname": "Svanberg", "age": "45" }{ "firstname": "Hans", "lastname": "Karlsson", "age": "55"

Ser upplägget korekt ut?

Permalänk
Medlem
Skrivet av llxt:

Hur kan jag lägga till ett ID som öker varje gång jag kör skriptet? Jag antar att jag måste läsa av user.json för att hitta åt det högsta IDt för att sedan plussa på IDt med 1?

Det är ett alternativ. Ett annat alternativ är att ha en separat fil där senast använda Id finns och som du skriver om varje gång du plockar ut ett Id ur nummerserien. Det kan vara effektivare än att hitta sista/högst numrerade posten i user.json. JSON-filer parsas i allmänhet som en helhet, så att hitta sista posten i en stor fil kan vara innefektivt.

Å andra sidan skrivs JSON oftast som en helhet också, så att lägga till en post i slutet på en korrekt JSON-array är lite av ett fulhack. Personligen tycker jag nog att JSON är ett dåligt val för den här typen av loggfiler av just den anledningen. Samma sak med XML. I just det här scenariot tycker jag att något så yxigt som fixlängds-flatfiler kan vara vettiga eftersom de är enkla att söka i. Alternativt radbryts/semikolonavgränsade filer som också föreslagits.

Diskussionen är dock rätt akademisk så länge du inte har hundratusentals poster i filen.

Permalänk
Medlem
Skrivet av llxt:

{ "firstname": "Emil", "lastname": "Larsson", "age": "42" }{ "firstname": "Daniel", "lastname": "Karlsson", "age": "20" }{ "firstname": "Erik", "lastname": "Svanberg", "age": "45" }{ "firstname": "Hans", "lastname": "Karlsson", "age": "55"

Ser upplägget korekt ut?

Det är inte korrekt JSON, vilket du inte nödvändigtvis behöver bry dig om. Det finns webbbsidor som hjälper dig att validera JSON.

Permalänk
Medlem
Skrivet av KAD:

Det är inte korrekt JSON, vilket du inte nödvändigtvis behöver bry dig om. Det finns webbbsidor som hjälper dig att validera JSON.

Kan du ge mig ett exempel på hur jag kan skriva python delen för JSON?

Permalänk
Medlem
Skrivet av KAD:

Det är ett alternativ. Ett annat alternativ är att ha en separat fil där senast använda Id finns och som du skriver om varje gång du plockar ut ett Id ur nummerserien. Det kan vara effektivare än att hitta sista/högst numrerade posten i user.json. JSON-filer parsas i allmänhet som en helhet, så att hitta sista posten i en stor fil kan vara innefektivt.

Okej tack. ska kika på det

Permalänk
Medlem

Kanske lättare med att assigna keys.

import json user_json = {} user_list = [('Emil', 'Larsson', 42), ('Daniel', 'Karlsson', 20), ('Erik', 'Svanberg', 45)] key = 0 for user in user_list: key += 1 id = f'user_{key}' first_name = user[0] last_name = user[1] age = user[2] user_json.update({id: {'firstname': first_name, 'lastname': last_name, 'age': age}}) with open('user.json', 'w') as f: f.write(json.dumps(user_json, indent=4)) for k, v in user_json.items(): firstname = v['firstname'] lastname = v['lastname'] age = v['age']

{ "user_1": { "firstname": "Emil", "lastname": "Larsson", "age": 42 }, "user_2": { "firstname": "Daniel", "lastname": "Karlsson", "age": 20 }, "user_3": { "firstname": "Erik", "lastname": "Svanberg", "age": 45 } }

Visa signatur

AMD 7800X3D | ASUS TUF X670E-PLUS | Corsair Vengeance DDR5 32GB EXPO | ASUS TUF 4090 OC 24GB |
Noctua NH-U12A | Corsair 4000D | Corsair AX1200W | Steelseries Apex 7 | Steelseries Sensei Ten | ASUS VG35VQ

https://github.com/Mariusz89B

Permalänk
Medlem
Skrivet av M89:

Kanske lättare med att assigna keys.

import json user_json = {} user_list = [('Emil', 'Larsson', 42), ('Daniel', 'Karlsson', 20), ('Erik', 'Svanberg', 45)] key = 0 for user in user_list: key += 1 id = f'user_{key}' first_name = user[0] last_name = user[1] age = user[2] user_json.update({id: {'firstname': first_name, 'lastname': last_name, 'age': age}}) with open('user.json', 'w') as f: f.write(json.dumps(user_json, indent=4)) for k, v in user_json.items(): firstname = v['firstname'] lastname = v['lastname'] age = v['age']

{ "user_1": { "firstname": "Emil", "lastname": "Larsson", "age": 42 }, "user_2": { "firstname": "Daniel", "lastname": "Karlsson", "age": 20 }, "user_3": { "firstname": "Erik", "lastname": "Svanberg", "age": 45 } }

Ja fast detta lagrar väl inte tidigare inputs? Det skriver väll bara över hela filen?

Permalänk
Medlem
Skrivet av llxt:

Ja fast detta lagrar väl inte tidigare inputs? Det skriver väll bara över hela filen?

Stämmer, dock var det endast ett exempel för att visa då jag inte kunde återskapa dina sys.argv därav "user_list". Du kan ju givetvis appenda till filen som tidigare.

Visa signatur

AMD 7800X3D | ASUS TUF X670E-PLUS | Corsair Vengeance DDR5 32GB EXPO | ASUS TUF 4090 OC 24GB |
Noctua NH-U12A | Corsair 4000D | Corsair AX1200W | Steelseries Apex 7 | Steelseries Sensei Ten | ASUS VG35VQ

https://github.com/Mariusz89B

Permalänk
Medlem
Skrivet av M89:

Stämmer, dock var det endast ett exempel för att visa då jag inte kunde återskapa dina sys.argv därav "user_list". Du kan ju givetvis appenda till filen som tidigare.

Ja. Fast det är inte riktigt det jag är ute efter. Kör jag ditt skript två gånger kommer den inte att komma ihåg det sista IDt för att sedan fortsätta på id 4+?

Permalänk
Medlem
Skrivet av llxt:

Ja. Fast det är inte riktigt det jag är ute efter. Kör jag ditt skript två gånger kommer den inte att komma ihåg det sista IDt för att sedan fortsätta på id 4+?

Du kan ju fortsätta på id i filen, läs in den med json och ändra key till sista nyckeln i uppslagsverket.

import json import os user_json = {} user_list = [('Emil', 'Larsson', 42), ('Daniel', 'Karlsson', 20), ('Erik', 'Svanberg', 45)] key = 0 if os.path.exists('user.json'): with open('user.json', 'r') as f: r = f.read() if len(r) > 0: data = json.loads(r) key = int([k for k in data.keys()][-1].replace('user_', '')) else: with open('user.json', 'w') as f: f.write('') for user in user_list: key += 1 id = f'user_{key}' first_name = user[0] last_name = user[1] age = user[2] user_json.update({id: {'firstname': first_name, 'lastname': last_name, 'age': age}}) with open('user.json', 'r+') as f: r = f.read() if len(r) > 0: data = json.loads(r) data.update(user_json) f.seek(0) json.dump(data, f) else: json.dump(user_json, f) for k, v in data.items(): firstname = v['firstname'] lastname = v['lastname'] age = v['age']

Visa signatur

AMD 7800X3D | ASUS TUF X670E-PLUS | Corsair Vengeance DDR5 32GB EXPO | ASUS TUF 4090 OC 24GB |
Noctua NH-U12A | Corsair 4000D | Corsair AX1200W | Steelseries Apex 7 | Steelseries Sensei Ten | ASUS VG35VQ

https://github.com/Mariusz89B