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?

Code: Alles auswählen

>>> type(2)
<type 'int'>
>>> type("2")
<type 'str'>
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 :D

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 :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)

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

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)

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:

Code: Alles auswählen

from __future__ import print_function

Re: in eine Datei schreiben

Verfasst: Dienstag 5. Juni 2012, 09:22
von 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']

Re: in eine Datei schreiben

Verfasst: Dienstag 5. Juni 2012, 09:30
von Hyperion
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:

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?