Digitaler Warenkorb mit NFC Tags in einer Liste darstellen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Paraya21
User
Beiträge: 14
Registriert: Donnerstag 23. Juni 2016, 14:54

Ich weiß, dass list.count() Daten aus einer Liste zählen kann, wie oft welches vorkommt.
Doch bei meinem habe ich keine vorgefertigte Liste, sondern Daten die in der Liste reinkommen.
Ja das die Zeile 5 nicht robust ist, ist mir klar, aber es ist jedes Mal die gewünschte Zeile die ich benötige.

Doch es muss doch mit einem command möglich sein, dass es erkennt, wenn dasselbe Element bereits im Dokument drinnen ist (
das Zeile für Zeile die Daten einträgt), dieses 2 mal zählt, anstatt nochmal dasselbe hinzuschreiben.
MFG :shock:
BlackJack

@Paraya21: Wenn Zeile 6 wirklich jedes mal die Zeile wäre, dann wäre es ja robust. Das ist aber nur so eine Annahme von Dir die nicht stimmen muss. Solange Du nicht in der Dokumentation oder im Programm die Stelle findest, an der garantiert wird, dass in der 6. Zeile immer der Titel steht, ist das ein Programmierfehler dort hart den Index 5 rein zu schreiben.

Das was Du willst ist nicht mit einem ”command” möglich. So ein Verhalten muss man sich programmieren. Das Problem in kleinere Schritte aufteilen und die einzelnen Schritte dann mit Befehlen und Funktionen, gegebenenfalls auch anderen Objekten, in Python als Programm umsetzen. Wobei man sich an der Stelle auch gleich um geeignete Datenstrukturen Gedanken machen könnte/sollte, denn mit einer einfachen Liste von Zeilen ist es ja nicht getan wenn eine Zeile aus zwei Werten besteht und eine davon auch keine Zeichenkette, sondern eine Zahl ist.

Wobei man das Gesamtproblem hier schon sinnvoll auf mehrere Funktionen aufteilen sollte. Mindestens das einlesen und das schreiben der Datei, wobei das beim lesen in eine geeignete Datenstruktur überführt werden sollte und beim schreiben dann wieder in die Repräsentation, die man in der Textdatei haben möchte. Und das wird dann von einer Funktion aus verwendet die das Hauptprogramm beinhaltet. Auf Modulebene gehört das nämlich nicht. Da gehören nur Definitionen von Konstanten, Funktionen, und Klassen hin.

Dein nächster Schritt sollte ein Anfängertutorial für Python sein. Wie gesagt, es gibt eines in der Python-Dokumentation. Für absolute Programmieranfänger wird auch oft Learn Python The Hard Way empfohlen (nicht vom Namen abschrecken lassen).
Paraya21
User
Beiträge: 14
Registriert: Donnerstag 23. Juni 2016, 14:54

bei folgendem Code:
with open("mains.txt") as rfile:
lines = rfile.readlines() [5]

f1 = open("NewFile", 'a')
f1.write(lines + '\n')

zwischen open und write, muss man doch eine if bedingung festlegen können:
if (der Title: Paprika schon vorhanden im NewFile)
then count
else not count

Könnte mir da einer mit dem Code behilflich sein?
Paraya21
User
Beiträge: 14
Registriert: Donnerstag 23. Juni 2016, 14:54

So ich habs bis hier:

Code: Alles auswählen

#!/usr/bin/python

with open("mains.txt") as rfile:
	lines = rfile.readlines() [5]

f1 = open("NewFile.txt", "r")
text = f1.read()
f2 = open("NewFile.txt", 'a')

if lines in text: 
	print("Hier soll es hochzählen: 1,2,3,4)
else:
	f2.write(lines + '\n')
In der Zeile wo print steht, soll eben der Text, wenn er doppelt vorkommt (Title: Paprika), es so ausgeben:
Title: Paprika (2)
wenns 3 mal dasselbe ist, dann:
Title: Paprika (3)

Könnt ihr mir da beim Code helfen?
BlackJack

@Paraya21: Das machst Du Dir zu einfach. Der Name `lines` ist falsch; `f1` und `f2` sehr schlecht. Du öffnest zweimal Dateien die nicht wieder geschlossen werden. ``with`` kennst Du doch bereits. Zu testen ob der Titel *irgendwo* in der Datei vorkommt ist falsch, weil ein Artikelname ja auch Teil eines anderen sein kann, dann hat man falsche Treffer, und wenn man einen Treffer hat, dann müsste man diese Zeile in ihre Bestandteile zerlegen, die Zahldarstellung tatsächlich in eine Zahl umwandeln um sie um eins zu erhöhen, und dann nützt einem der Dateimodus ”anhängen” irgendwie nichts, denn dann muss man alle Daten, inklusive der veränderten neu zusammen gesetzten Zeile mit dem neuen Anzahlwert wieder schreiben.

Du benutzt immer noch die ”magische” 5 statt nach der Zeile mit dem Titel-Präfix zu suchen, und der Präfix macht in der Datei für's zählen keinen Sinn. Da sollte der nicht drin stehen.

Und das alles nicht einfach so auf Modulebene, sondern am besten in der Funktionsaufteilung die ich schon beschrieben hatte. Hauptprogramm, einlesen der Anzahldatei, schreiben der Anzahldatei, und noch eine Funktion die den Titel aus der Datei holt die vom NFC-Beispielprogramm geschrieben wird. Da macht eine eigene Funktion zum Beispiel Sinn, weil man deren Inhalt später durch den direkten Aufruf dieses NFC-Programms ersetzen kann, ohne das man dann noch ein Shellskript und eine Datei dafür braucht.

Lern Python! So ganz allgemein kann Dir das niemand abnehmen, das muss sich jeder selber erarbeiten. Es sei denn jemand hat Lust Dein Programm für Dich zu schreiben. Du kannst konkrete Fragen zu konkreten Problemen stellen, aber bitte zeig etwas Eigeninitiative. Nicht nur schnell irgendwas zusammenhacken und dann hier rein stellen und sagen macht mal.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Paraya21: teile Dein Problem in Teilprobleme auf. Also "Lesen einer NFC-Datei und ermitteln des Titels". Das ist bis jetzt noch nicht schön gelöst: magischer Index, Zeile mit "Title:" am Anfang, Variablennamen lines ist falsch, etc. Zweites Teilproblem: "Lesen einer anderen Datei mit den Daten Anzahl und Titel, und hochzählen der Anzahl und Speichern". Dieses Problem ist komplexer, so dass es sinnvoll ist, dieses Problem in weitere Teile zu unterteilen. Da stellt sich gleich die Frage nach den passenden Datenstrukturen (Liste, Wörterbuch, ...) und dem passenden Dateiformat (csv, json, ...).
Paraya21
User
Beiträge: 14
Registriert: Donnerstag 23. Juni 2016, 14:54

Code: Alles auswählen

#!/usr/bin/python
# coding=utf-8

with open("mains.txt") as rfile:
	lines = rfile.readlines() [5]

f2 = open("NewFile", 'a')
f1 = open("NewFile", "r")
text = f1.read()

i = 2

if lines in text:
	f2.write(str(i) + ":"+ lines)
	i = i + 1
else:
	f2.write(lines + '\n')
Die Ausgabe davon nach 3 maligem ausführen:
Title: Schachtel
2: Title: Schachtel
2: Title: Schachtel

Ausgabe davon nach 6 maligem Ausführen: (3mal ein Tag, 3 mal ein anderer Tag)
Title: Schachtel
2: Title: Schachtel
2: Title: Schachtel
Title: Dosenöffner
2: Title: Dosenöffner
2: Title: Dosenöffner

Ich möchte gerne, dass die Zahl größer wird und bei 2 eben anfängt, weil ja eine Schachtel am Anfang ja schon da ist.
Schaut blöd aus wenn da steht:
Title: Schachtel
1: Title: Schachtel
1: Title: Schachtel

Habe es schon mit einer for schleife ausprobiert, aber nichts will klappen. Hat wer eine Idee?
Gesperrt