Dateien in eine Funktion übergeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
StyleFile
User
Beiträge: 8
Registriert: Donnerstag 24. Februar 2022, 13:19

Hallo zusammen,

ich würde gerne beim Aufruf einer Funktion die Dateien names.txt und numbers.txt übergeben. Nun habe ich das Problem, dass ich keine Text Dateien in die Funktion übergeben kann und immer folgender Fehler kommt:

paste (names.txt, numbers.txt)
NameError: name 'names' is not defined

Mein Code:

def paste(file1, file2):
a=open("file1")
b=open("file2")
f=a.read()
g=b.read()
c=f.splitlines()
d=g.splitlines()
print(f"{c[0]:<15}{d[0]}")
print(f"{c[1]:<15}{d[1]}")
print(f"{c[2]:<15}{d[2]}")
print(f"{c[3]:<15}{d[3]}")
file1.close()
file2.close()

paste (names.txt, numbers.txt)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst dir ueber die korrekte Verwendung der Anfuehrungszeichen fuer String-Literale klar werden.

foo

ist ein Name.

"foo"

ist ein String. Deine Funktion bekommt zwei Namen, die du dann falsch mit "file1" als Strings versuchst zu benutzen. Der Aufruf hingegen muss mit "names.txt" geschehen, weil das ja nunmal die Dateinamen sind.
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Es gibt Variablennamen und es gibt literale Strings, die in Anführungszeichen gesetzt werden. "file1" ist ein String, names.txt ist eine Variable names dessen Attribut txt abgefragt wird.

Einbuchstabige Variablennamen sind fast immer ungeeignt, weil sie nichtssagend sind, bei Dir sind das sogar 6 Buchstaben, die völlig willkürlich gewählt worden sind. Dateien öffnet man mit dem with-Statement, statt Zeilen zu kopieren benutzt man Schleifen.

Code: Alles auswählen

def paste(filename1, filename2):
    with open(filename1) as file1, open(filename2) as file2:
        for line1, line2 in zip(file1, file2):
	    print(f"{line1.rstrip():<15}{line2.rstrip()}")

paste("names.txt", "numbers.txt")
StyleFile
User
Beiträge: 8
Registriert: Donnerstag 24. Februar 2022, 13:19

Vielen Dank für die Hilfe! Ihr habt mir da sehr geholfen. Mit paste("names.txt", "numbers.txt") funktioniert es nun ohne Probleme, jedoch soll ich es mit dem Aufruf: paste names.txt numbers.txt ausführen können. Kann man das irgendwie implementieren? Schon einmal vielen Dank!!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Deine Beschreibung, was du tun willst, ist unklar. Meinst du die Kommandozeile damit? Dann geht das zb mit sys.argv.
StyleFile
User
Beiträge: 8
Registriert: Donnerstag 24. Februar 2022, 13:19

Hallo, nach Ausführung des Programms soll im Idle mit dem Aufruf: paste names.txt numbers.txt die Funktion ausgeführt werden. Aktuell kann ich sie nur mit der Syntax paste("names.txt", "numbers.txt") ausführen
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das geht in IDLE nicht. Das “spricht” nur Python.
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich denke das ist die beliebte (?) Hausaufgabenserie: Programmieren sie die Unix/Linux Textwerkzeuge in Python nach. Das hatten wir vor einiger Zeit hier schon mal im Forum. Hier wäre die Dokumentation zum ``paste``-Aufruf: https://www.gnu.org/software/coreutils/ ... ation.html

Selbst bei Beschränkung genau zwei Dateien und keine der Optionen, bleibt noch die Frage wie das Programm damit umgehen soll, falls die Dateien unterschiedliche Zeilenanzahl haben. Die Lösung von Sirius3 macht da etwas anderes als als das ``paste``-Programm.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
StyleFile
User
Beiträge: 8
Registriert: Donnerstag 24. Februar 2022, 13:19

Ja genau ich soll über ein Hauptprogramm(main) die beiden Dateien über den Befehl python paste names.txt numbers.txt ausführen. Anschließend noch mit Parametern wie z.B. paste -d die Ausgabe ändern. Naja ich schaue da mal bei der Dokumentation nach, vielleicht finde ich da was. Aber schonmal vielen Dank für die Hilfe!
Antworten