in eine Datei schreiben

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
lalalu
User
Beiträge: 13
Registriert: Freitag 1. Juni 2012, 08:56

Code: Alles auswählen

fobj = open('Verzeichnis.txt', 'w')
q = [2, 3, 7, 2, 57]
w = [4, 55, 3, 44]
fobj.writelines(q)
fobj.writelines(w)
print q
print w
fobj.close()
die Fehlermeldung: TypeError: writelines() argument must be a sequence of strings
WARNING: Failure executing file: <test.py>

Also ich möchte die Listen q und w in die Datei "Verzeichnis" schreiben. Mit der Fehlermeldung kann ich so wirklich auch nichts mit anfangen. Muss ich da einen anderen Befehl verwenden oder es ganz anders angehen?...
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

lalalu hat geschrieben:die Fehlermeldung: TypeError: writelines() argument must be a sequence of strings
WARNING: Failure executing file: <test.py>

Also ich möchte die Listen q und w in die Datei "Verzeichnis" schreiben. Mit der Fehlermeldung kann ich so wirklich auch nichts mit anfangen.
Die Fehlermeldung ist eigentlich eindeutig. Erwartet wird eine Sequenz aus Strings. Deine Sequenzen (also die Listen) enthalten aber keine Strings. In der Dokumentation zu writelines steht das ganze auch eindeutig. Wie würde denn für dich eine klarere Fehlermeldung aussehen?

Code: Alles auswählen

>>> type(2)
<type 'int'>
>>> type("2")
<type 'str'>
Du musst also aus den Integer-Werten in deiner Liste Strings machen.
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Ich würde es so machen, denke ich:

Code: Alles auswählen

q = [2, 3, 7, 2, 57]
w = [4, 55, 3, 44]

with open('Verzeichnis.txt', 'w') as f:

    for item in q:
        f.write(str(item) + "\n")
    for item in w:
        f.write(str(item) + "\n")
        
print(q)
print(w)
Anmerkungen?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

pixewakb hat geschrieben:Anmerkungen?
Aber ja doch. So kannst du die Bestandteile nie wieder den einzelnen Listen zuordnen. OK, der OP hätte das mit seinem Ansatz auch nicht gekonnt, aber ich denke nicht, dass das wirklich das Ziel ist.
lalalu
User
Beiträge: 13
Registriert: Freitag 1. Juni 2012, 08:56

Tipp top hab es soweit hinbekommen ;) ... dank euch :)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:


GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
lalalu
User
Beiträge: 13
Registriert: Freitag 1. Juni 2012, 08:56

Wie geht denn das, dass er die volle Textbreite von 8 mit nullen ausfüllt ? ... zb. 00000100
Mit einzelnen Zahlen hab ich das schon hinbekommen aber wie geht das, dass er das auf einer Liste anwendet?

Code: Alles auswählen

q = [2, 3.3, 7.6]
a = 3
print 'a = %08d' % a
print 'q = %08d' % q
TypeError: %d format: a number is required, not list
deets

Das magische Wort heisst "for-schleife".
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

lalalu hat geschrieben:Wie geht denn das, dass er die volle Textbreite von 8 mit nullen ausfüllt ? ... zb. 00000100
Mit einzelnen Zahlen hab ich das schon hinbekommen aber wie geht das, dass er das auf einer Liste anwendet?
Du musst jedes einzelne Element der Liste durchlaufen. Um eine neue Liste mit formatierten Daten zu erstellen könntest du folgenden Code verwenden:

Code: Alles auswählen

q = [2, 3.3, 7.6]
new_data = []
for element in q:
    new_data.append('%08d'%element)
print(new_data)
Der Code sollte eigentlich selbsterklärend sein.


Eine andere Möglichkeit ist die Verwendung einer List Comprehension:

Code: Alles auswählen

q = [2, 3.3, 7.6]
new_data = ['%08d'%element for element in q]
print(new_data)

Bevor jetzt noch jemand die Variante mit map rauskramt zeige ich sie lieber selber :D

Code: Alles auswählen

q = [2, 3.3, 7.6]
new_data = map(lambda x: '%08d'%x, q)
print(new_data)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

/me hat geschrieben:Bevor jetzt noch jemand die Variante mit map rauskramt zeige ich sie lieber selber :D

Code: Alles auswählen

q = [2, 3.3, 7.6]
new_data = map(lambda x: '%08d'%x, q)
print(new_data)
Dann erledige ich die Variante ohne lambda :D

Code: Alles auswählen

from operator import mod
from functools import partial
q = [2, 3.3, 7.6]
new_data = map(partial(mod, '%08d'), q)
print(new_data)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Ich bin verwirrt. Was sollen immer die Klammern beim ``print``? Sollte das Python 3.x sein, dann liefert `map()` ein „iterable” und keine Liste — das möchte man sicher nicht ausgeben.

Ausserdem schneidet '%d' bei Gleitkommazahlen den Nachkomma-Anteil ab. An der Stelle sollte der OP vielleicht noch mal klarstellen, dass er bei 3.3 das Ergebnis '0000003' haben möchte und nicht etwa '00003.3'. In dem Fall:

Code: Alles auswählen

In [208]: map(lambda v: str(v).zfill(8), values)
Out[208]: ['00000002', '000003.3', '000007.6']
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BlackJack hat geschrieben:Sollte das Python 3.x sein, dann liefert `map()` ein „iterable” und keine Liste — das möchte man sicher nicht ausgeben.
In dem Falle also

Code: Alles auswählen

print(*new_data)
bei /me und Leonidas Lösungen ;-)

Wobei mir auch nicht klar ist, ob die Nachkommastellen nun wirklich abgeschnitten werden sollen oder nicht.

Alternativ zu BlackJacks `zfill` Ansatz einer mit der hier eher unbeliebten `format`-Methode:

Code: Alles auswählen

new_data = map(lambda x: '{:08}'.format(x), q)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

BlackJack hat geschrieben:Ich bin verwirrt. Was sollen immer die Klammern beim ``print``?
Das liegt daran, dass im Header jeder meiner Dateien Folgendes steht:

Code: Alles auswählen

from __future__ import print_function
BlackJack

@Hyperion: Useless use of ``lambda`` :-P

Code: Alles auswählen

In [210]: map('{0:08}'.format, values)
Out[210]: ['00000002', '000003.3', '000007.6']
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BlackJack hat geschrieben:@Hyperion: Useless use of ``lambda`` :-P
:oops: Naja, ich habe ja nur Code von "oben" adaptiert, ohne groß darüber nachzudenken... :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
lalalu
User
Beiträge: 13
Registriert: Freitag 1. Juni 2012, 08:56

BlackJack hat geschrieben:Ich bin verwirrt. Was sollen immer die Klammern beim ``print``? Sollte das Python 3.x sein, dann liefert `map()` ein „iterable” und keine Liste — das möchte man sicher nicht ausgeben.

Ausserdem schneidet '%d' bei Gleitkommazahlen den Nachkomma-Anteil ab. An der Stelle sollte der OP vielleicht noch mal klarstellen, dass er bei 3.3 das Ergebnis '0000003' haben möchte und nicht etwa '00003.3'. In dem Fall:

Code: Alles auswählen

In [208]: map(lambda v: str(v).zfill(8), values)
Out[208]: ['00000002', '000003.3', '000007.6']

also er sollte schon 000003.3 oder 023.3421 schreiben

zusätzlich sollte er mir 2 Listen noch vertikal nebeneinander ausgeben... das ging auch mit der for schleife richtig?
Antworten