Seite 1 von 1
in eine Datei schreiben
Verfasst: Montag 4. Juni 2012, 19:41
von lalalu
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?...
Re: in eine Datei schreiben
Verfasst: Montag 4. Juni 2012, 19:51
von /me
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?
Du musst also aus den Integer-Werten in deiner Liste Strings machen.
Re: in eine Datei schreiben
Verfasst: Montag 4. Juni 2012, 19:58
von pixewakb
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?
Re: in eine Datei schreiben
Verfasst: Montag 4. Juni 2012, 20:01
von /me
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.
Re: in eine Datei schreiben
Verfasst: Montag 4. Juni 2012, 20:25
von lalalu
Tipp top hab es soweit hinbekommen

... dank euch

Re: in eine Datei schreiben
Verfasst: Montag 4. Juni 2012, 20:50
von jens
Re: in eine Datei schreiben
Verfasst: Montag 4. Juni 2012, 21:30
von lalalu
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
Re: in eine Datei schreiben
Verfasst: Montag 4. Juni 2012, 22:02
von deets
Das magische Wort heisst "for-schleife".
Re: in eine Datei schreiben
Verfasst: Montag 4. Juni 2012, 22:06
von /me
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
Code: Alles auswählen
q = [2, 3.3, 7.6]
new_data = map(lambda x: '%08d'%x, q)
print(new_data)
Re: in eine Datei schreiben
Verfasst: Dienstag 5. Juni 2012, 08:00
von Leonidas
/me hat geschrieben:Bevor jetzt noch jemand die Variante mit
map rauskramt zeige ich sie lieber selber
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
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)
Re: in eine Datei schreiben
Verfasst: Dienstag 5. Juni 2012, 08:12
von 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']
Re: in eine Datei schreiben
Verfasst: Dienstag 5. Juni 2012, 08:21
von Hyperion
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
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:
Re: in eine Datei schreiben
Verfasst: Dienstag 5. Juni 2012, 08:26
von /me
BlackJack hat geschrieben:Ich bin verwirrt. Was sollen immer die Klammern beim ``print``?
Das liegt daran, dass im Header jeder meiner Dateien Folgendes steht:
Re: in eine Datei schreiben
Verfasst: Dienstag 5. Juni 2012, 09:22
von BlackJack
@Hyperion: Useless use of ``lambda``
Code: Alles auswählen
In [210]: map('{0:08}'.format, values)
Out[210]: ['00000002', '000003.3', '000007.6']
Re: in eine Datei schreiben
Verfasst: Dienstag 5. Juni 2012, 09:30
von Hyperion
BlackJack hat geschrieben:@Hyperion: Useless use of ``lambda``

Naja, ich habe ja nur Code von "oben" adaptiert, ohne groß darüber nachzudenken...

Re: in eine Datei schreiben
Verfasst: Dienstag 5. Juni 2012, 18:31
von lalalu
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?