Seite 1 von 1

Text wrapper löschen/deaktivieren

Verfasst: Montag 7. September 2020, 16:31
von rennmaus
Hallo zusammen,
Bei der Schreibung eines Programms ist mir ein kleiner Fehler unterlaufen, sodass ein Text wrapper erstellt wurde. Jetzt wird dieser aber immer verwendet, obwohl ich eine txt Datei erstellt habe. Ich bin frustriert, ich habe schon alles ausprobiert.
Soll ich vielleicht das komplette Programm hier mal einschicken? Ist nur kurz, vlt 50 Zeilen.

Mfg
Christian

Re: Text wrapper löschen/deaktivieren

Verfasst: Montag 7. September 2020, 16:56
von Sirius3
Wäre vielleicht ganz hilfreich. Aus der Beschreibung werde ich nicht ganz schlau.

Re: Text wrapper löschen/deaktivieren

Verfasst: Montag 7. September 2020, 17:11
von rennmaus
l='abrufen'
m='hinzufügen'
c='.txt'

print ("Das ist meine Datenbank verschiedener Deepsky Objekte")
print ("Möchtest du eine Information hinzufügen oder abrufen?")
x=str(input())
if x==l:
print ("Welches Objekt möchtest du abrufen? Bitte Namen oder Katalog-Nummer nennen")
o=str(input())

path = 'C:/Users/chris/Desktop/Objekte/'
filename = o
file = open ('C:/Users/chris/Desktop/Objekte/'+o+'/', 'r')
print (file.read)
b = input()
print (b)

if x==m:
print ("Wie heißt das Objekt welches sie hinzufügen wollen?")
z=str(input())
print ("Nennen sie bitte die Katalog-Nummer im NGC")
w = input ()
print ("Nennen sie bitte das Sternbild")
e = str(input())
print ("Nennen sie bitte die magnitude")
r = input()
print ("Nennen sie bitte zu welcher Jahreszeit es gehört")
t = str(input())

path = "C:/user/chris/Desktop/Objekte/"
filename = (z)
file = open (z+c, 'a')

k = input()
print (k)

file.write (z+"\n"+w+"\n"+"Sternbild:"+e+"\n"+"Magnitude:"+r+"\n"+"Jahreszeit"+t)
file.close()




Nicht wunder, wenn maches Unsinniges drinsteht, ich habe viel rumprobiert...

Re: Text wrapper löschen/deaktivieren

Verfasst: Montag 7. September 2020, 17:19
von rennmaus
Kurz off topic:
Der Modus w erstellt keine Datei richtig? Aber wenn der Modus X eine Textwrapper Datei erstellt, welche e gibt es dann noch die eine Datei erstellen?

Mfg
Christian

Re: Text wrapper löschen/deaktivieren

Verfasst: Montag 7. September 2020, 18:15
von Sirius3
Man muß keine Zeichen sparen. Variablennamen dürfen gerne mehr als ein Zeichen haben, vor allem sollten sie sprechend sein. Wie kommst Du drauf dass e Sternbild heißt, oder r die Magnitude?
`input` liefert schon einen String, str darauf aufzurufen ist also unsinnig.
Strings setzt man nicht mit + zusammen, sondern nutzt Formatstrings. Pfade setzt man erst recht nicht mit + zusammen, sondern nutzt was aus pathlib.
Erst versuchst Du etwas aus einem Verzeichnis zu lesen, was nicht klappen dürfte, dann schreibst Du was irgendwo hin ohne pfad zu verwenden. Zeilen werden mit einem Zeileendezeichen abgeschlossen.
Neben den ganzen Unzulänglichkeiten, wo hast Du nun ein Problem?

Code: Alles auswählen

from pathlib import Path

pfad = Path('C:/Users/chris/Desktop/Objekte')

print("Das ist meine Datenbank verschiedener Deepsky Objekte")
print("Möchtest du eine Information hinzufügen oder abrufen?")
auswahl = input()
if auswahl == "abrufen":
    print("Welches Objekt möchtest du abrufen? Bitte Namen oder Katalog-Nummer nennen")
    objekt = input()
    filename = pfad / objekt
    print(filename.read_text())
elif auswahl == "hinzufügen":
    print("Wie heißt das Objekt welches sie hinzufügen wollen?")
    objekt = input()
    print("Nennen sie bitte die Katalog-Nummer im NGC")
    katalog_nummer = input()
    print("Nennen sie bitte das Sternbild")
    sternbild = input()
    print("Nennen sie bitte die magnitude")
    magnitude = input()
    print ("Nennen sie bitte zu welcher Jahreszeit es gehört")
    jahreszeit = input()

    filename = pfad / objekt
    filename.write_text(
        f"{objekt}\n"
        f"{katalog_nummer}\n"
        f"Sternbild:{sternbild}\n"
        f"Jahreszeit:{jahreszeit}\n"
    )

Re: Text wrapper löschen/deaktivieren

Verfasst: Montag 7. September 2020, 18:35
von rennmaus
Vielen Dank für deine Mühe!
Ich probiere es später oder morgen aus.

Mfg
Christian

Re: Text wrapper löschen/deaktivieren

Verfasst: Montag 7. September 2020, 19:17
von ElektroBerry
Mal ein paar Verbesserungsvorschläge:
+ Zum Speichern der Daten ist vielleicht, eine CSV Datei besser geeignet, als viele kleine Textdateien.
+ Die Benutzerabfrage am Anfang (Objekt, Katalog Nummer, Sternenbild usw.) könnte man mit dem modul inquirer übersichtlicher gestalten.
+ Dateien mit "with open" lesen("r"), schreiben("w") und hinzufügen("a")
+ Beschäftige dich mehr mit den Grundlagen.

Code: Alles auswählen

import inquirer
from os.path import exists as file_exists
import csv


def main():
    SAVE_FILE = "sternenhimmel.csv"
    input_var = input("Daten (h)inzufügen oder (a)brufen? >> ")
    if input_var == "a":
        if not file_exists(SAVE_FILE):
            print("Fehler: Keine Datei gefunden.")
            return
        else:
            input_search = input("Wonach soll gesucht werden?"
                                 " >> ").lower()
            with open(SAVE_FILE) as csvfile:
                reader = csv.DictReader(csvfile)
                for row in reader:
                    if input_search in row["objektname"].lower() or \
                       input_search in row["katalog_nr"].lower():
                        for name in row:
                            print(f"{name.title()}: {row[name]}")
                        break
                else:
                    print("Keinen passenden Eintrag gefunden.")
    elif input_var == "h":
        with open(SAVE_FILE) as csvfile:
            reader = csv.DictReader(csvfile)
            objekte = {row["objektname"] for row in reader}
        answers = inquirer.prompt([inquirer.Text('objektname',
                                                 message="Objektname:")])
        if answers["objektname"] in objekte:
            print("Fehler: Objekt ist bereits in der Datei.")
            return
        questions = [inquirer.Text('katalog_nr', message="Katalog Nummer:"),
                     inquirer.Text('sternenbild', message="Sternenbild:"),
                     inquirer.Text('magnidute', message="Magnidute:")]
        answers.update(inquirer.prompt(questions))
        questions = [inquirer.List('jahreszeit', message="Jahreszeit?",
                                   choices=['Winter', 'Frühling',
                                            'Sommer', 'Herbst'], ), ]
        answers.update(inquirer.prompt(questions))
        if file_exists(SAVE_FILE):
            file_mode = "a"
        elif not file_exists(SAVE_FILE):
            file_mode = "w"
        with open(SAVE_FILE, mode=file_mode) as csvfile:
            fieldnames = ['objektname', 'katalog_nr', 'sternenbild',
                          'magnidute', 'jahreszeit']
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
            if file_mode == "w":
                writer.writeheader()
            writer.writerow(answers)
    else:
        print("Falsche Eingabe.")


if __name__ == '__main__':
    main()



Re: Text wrapper löschen/deaktivieren

Verfasst: Montag 7. September 2020, 19:22
von rennmaus
Hui, das ist sehr nett von euch! Ich lese mir mal beide Codes sorgfältig durch und versuche sie nachzuvollziehen. Das mit den Grundlagen mache ich gerne :)

Mfg
Christian

Re: Text wrapper löschen/deaktivieren

Verfasst: Montag 7. September 2020, 19:55
von rennmaus
Tut mir leid, wenn ich mich gerade ein bisschen blöd anstelle, aber bei mir kommt da immer, no module named inquirer... Ich kann verstehen, wenn das ein bisschen frustrierend iist, mir zu helfen....

Mfg
Christian

Re: Text wrapper löschen/deaktivieren

Verfasst: Montag 7. September 2020, 20:48
von Sirius3
inquirer ist ein externes Modul, das Du extra installieren mußt.

@ElektroBerry: Konstanten werden am Anfang der Datei gesammelt. Was soll das `var` bei input_var bedeuten? Was wird bei `input_search` gesucht? Dass der Wert dieser Variablen irgendwann einmal eingegeben wurden, ist für die Bedeutung im Code irrelevant.
Wenn die elif-Bedingung das exakte Gegenteil der if-Bedingung ist, sollte man else benutzen.

Re: Text wrapper löschen/deaktivieren

Verfasst: Dienstag 8. September 2020, 12:48
von rennmaus
Bei mir funktionieren beide nicht wirklich...
Bei @Elektroberry verstehe ich nicht ganz, wie das funktioniert, da wenn ich a eingebe, steht da dass keine Datei gefunden wurde.
Bei @Sirius3 steht da in etwa das selbe, wenn ich eine Datei hinzufügen möchte.

Mfg
Christian

Re: Text wrapper löschen/deaktivieren

Verfasst: Dienstag 8. September 2020, 13:08
von Sirius3
Bitte exakt beschreiben, was Du ausgeführt und getan hast und welche Fehlermeldung inklusive komplettem Traceback kommt.

Re: Text wrapper löschen/deaktivieren

Verfasst: Dienstag 8. September 2020, 13:22
von rennmaus
@Elektrobarry:
Wenn ich dein Programm starte, wird mir in VSC gleich ein Problem angezeigt: unresolved import 'inquirer'
Dabei habe ich über "pip install inquirer" installiert. Wenn ich dein Programm dann laufen lasse, kommt die erste Nachricht, aber wenn ich "a" eingebe kommt im output immer: Fehler: Keine Datei gefunden.
Wenn ich "h" eingebe, kommt dort:
Traceback (most recent call last):
File "c:/Users/chris/Desktop/Deepsky Datenbank/Datenbank.py", line 59, in <module>
main()
File "c:/Users/chris/Desktop/Deepsky Datenbank/Datenbank.py", line 27, in main
with open(SAVE_FILE) as csvfile:
FileNotFoundError: [Errno 2] No such file or directory: 'sternenhimmel.csv'


@Sirius3:
Wenn ich dein Programm starte, und "hinzufügen" eingebe, funktioniert das alles so weit, bis ans Ende, wo dann diese Fehlermeldung auftaucht:
Traceback (most recent call last):
File "c:/Users/chris/Desktop/Deepsky Datenbank/Daten.py", line 26, in <module>
filename.write_text(
File "C:\Users\chris\AppData\Local\Programs\Python\Python38\lib\pathlib.py", line 1251, in write_text
with self.open(mode='w', encoding=encoding, errors=errors) as f:
File "C:\Users\chris\AppData\Local\Programs\Python\Python38\lib\pathlib.py", line 1218, in open
return io.open(self, mode, buffering, encoding, errors, newline,
File "C:\Users\chris\AppData\Local\Programs\Python\Python38\lib\pathlib.py", line 1074, in _opener
return self._accessor.open(self, flags, mode)
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\chris\\Desktop\\Objekte\\Iris Nebel'
Wenn ich "abrufen" eingebe, kommt im wesentlichen die gleiche Fehlermeldung. Ich habe sogar extra eine Datei mit dem Namen erstellt...

Danke, dass ihr euch die Mühe macht und mir helft!

Mfg
Christian

Re: Text wrapper löschen/deaktivieren

Verfasst: Dienstag 8. September 2020, 13:25
von __blackjack__
@rennmaus: Bei dem Code von Elektroberry wird es die Datei dann wohl nicht geben. Das ist dann ja auch das richtige verhalten bei "a" wie abrufen. Was hättest Du denn ohne das da Daten existieren würden sonst erwartet was passieren sollte wenn man versucht was abzurufen was nicht da ist?

Bei "h" ist das dann tatsächlich ein Programmierfehler. Der aber irgendwo auch ziemlich offensichtlich ist und deshalb das Programmverhalten an der Stelle nicht wirklich überraschen sollte.

Beim Code von Sirius3 kann das eigentlich nur passieren wenn es das Verzeichnis "C:/Users/chris/Desktop/Objekte" nicht gibt. Öffnen von Dateien, auch zum schreiben, erstellt nicht auf magische Weise alle Verzeichnisse bis zu der Datei. Also entweder musst Du das Verzeichnis anlegen, oder ein anderes, existierendes im Code angeben.

Re: Text wrapper löschen/deaktivieren

Verfasst: Dienstag 8. September 2020, 13:33
von rennmaus
Naja also das Verzeichnis existiert und ist auch richtig eingegeben. Wie könnte ich das Problem denn jetzt lösen?

Mfg
Christian

Re: Text wrapper löschen/deaktivieren

Verfasst: Dienstag 8. September 2020, 13:39
von __blackjack__
@rennmaus: Wenn der Fehler mit dem Code von Sirus3 beim schreiben einer Datei kommt, dann kann es das Verzeichnis nicht geben, denn sonst würde ja der Fehler nicht kommen.

Re: Text wrapper löschen/deaktivieren

Verfasst: Dienstag 8. September 2020, 13:51
von rennmaus
Oh Gott tut mir leid, ich hatte wirklich ein falsches Verzeichnis angegeben... Geht alles super! Vielen vielen Dank @Sirius3 und natürlich auch an @Elektroberry und @__blackjack__.

Re: Text wrapper löschen/deaktivieren

Verfasst: Dienstag 8. September 2020, 16:49
von ElektroBerry
Ich habe die Hinweise beachtet und es war wirklich ein Fehler in dem Skript.
Es wurde versucht die Datei zu lesen, um zu überprüfen ob das Himmelsobjekt schon drin ist, bevor sie erstellt wurde.
Hoffentlich habe ich jetzt nichts übersehen.

Code: Alles auswählen

import inquirer
from os.path import exists as file_exists
import csv


SAVE_FILE = "sternenhimmel.csv"


def main():
    antwort = input("Daten (h)inzufügen oder (a)brufen? >> ")
    if antwort == "a":
        if not file_exists(SAVE_FILE):
            print("Fehler: Keine Datei gefunden.")
            return
        else:
            name_search = input("Wonach soll gesucht werden?"
                                " >> ").lower()
            with open(SAVE_FILE) as csvfile:
                reader = csv.DictReader(csvfile)
                for row in reader:
                    if name_search in row["objektname"].lower() or \
                       name_search in row["katalog_nr"].lower():
                        for name in row:
                            print(f"{name.title()}: {row[name]}")
                        break
                else:
                    print("Keinen passenden Eintrag gefunden.")
    elif antwort == "h":
        if file_exists(SAVE_FILE):
            file_mode = "a"
            with open(SAVE_FILE) as csvfile:
                reader = csv.DictReader(csvfile)
                objekte = {row["objektname"] for row in reader}
        else:
            file_mode = "w"
        answers = inquirer.prompt([inquirer.Text('objektname',
                                                 message="Objektname:")])
        if file_mode == "a":
            if answers["objektname"] in objekte:
                print("Fehler: Objekt ist bereits in der Datei.")
                return
        questions = [inquirer.Text('katalog_nr', message="Katalog Nummer:"),
                     inquirer.Text('sternenbild', message="Sternenbild:"),
                     inquirer.Text('magnidute', message="Magnidute:")]
        answers.update(inquirer.prompt(questions))
        questions = [inquirer.List('jahreszeit', message="Jahreszeit?",
                                   choices=['Winter', 'Frühling',
                                            'Sommer', 'Herbst'], ), ]
        answers.update(inquirer.prompt(questions))
        with open(SAVE_FILE, mode=file_mode) as csvfile:
            fieldnames = ['objektname', 'katalog_nr', 'sternenbild',
                          'magnidute', 'jahreszeit']
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
            if file_mode == "w":
                writer.writeheader()
            writer.writerow(answers)
    else:
        print("Falsche Eingabe.")


if __name__ == '__main__':
    main()

Re: Text wrapper löschen/deaktivieren

Verfasst: Dienstag 8. September 2020, 18:03
von nezzcarth
Zudem scheint der Fragensteller Windows zu verwenden und pypi sagt zu 'inquirer' 'Windows is not supported at the moment!