Wie bekommt man ein byte in die binärdatei?

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.
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Hallo, freunde... :D

Wie bekommt man das Byte in die Binärdatei?

Code: Alles auswählen

f= open("test.bin","wb")
byte=45
f.write(...)
f.close
danke.
gruss
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Ich vermute jetzt einfach mal, dass du die Funktion chr() suchst - damit erhälst du das entsprechende ASCII-Zeichen. Das kannst du dann in die Datei schreiben.

Besten Gruß,

brb
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Nach der Seite: http://mail.python.org/pipermail/tutor/ ... 01883.html

Code: Alles auswählen

Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open("test.bin", "wb")
>>> import struct
>>> byte=45
>>> data = struct.pack('i', byte)
>>> f.write(data)
>>> f.close()
>>> 
EDIT:
Oh, außerdem, so bekommt man die Daten wieder ;)

Code: Alles auswählen

>>> import struct
>>> f = open('test.bin', 'rb')
>>> intsize = struct.calcsize('i')
>>> data = f.read(intsize)
>>> num = struct.unpack('i', data)
>>> print num
(45,)
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Hallo, schreiben geht jetzt.
Lesen auch, weil keine Fehlermeldung kommt, aber das a wird nicht ausgegeben.

Gruss

Code: Alles auswählen

print "byte schreiben"
f=open("test.bin","wb")
f.write(chr(9))
f.write(chr(10))
f.close

print "byte lesen"
f= open("test.bin","rb")
a=str(f.read(1))
print a
a=str(f.read(1))
print a
f.close
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

funkheld hat geschrieben:Hallo, schreiben geht jetzt.
Lesen auch, weil keine Fehlermeldung kommt, aber das a wird nicht ausgegeben.

Gruss

Code: Alles auswählen

print "byte schreiben"
f=open("test.bin","wb")
f.write(chr(9))
f.write(chr(10))
f.close

print "byte lesen"
f= open("test.bin","rb")
a=str(f.read(1))
print a
a=str(f.read(1))
print a
f.close
Wieso magst du denn mit f.read(1) lesen? Und warum schreibst du den Tabulator und das Newline Zeichen in die Datei?
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Wieso magst du denn mit f.read(1) lesen? Und warum schreibst du den Tabulator und das Newline Zeichen in die Datei?
Die test.bin ist laut Windows nur 2byte gross.
Hmmmm..., in der test.bin stehen auch nur 2 byte drin, die 9 und die 10.
Wieso kommst du jetzt auf Tabulator und Newline.?....hm..
Zuletzt geändert von funkheld am Dienstag 2. November 2010, 18:52, insgesamt 1-mal geändert.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

funkheld hat geschrieben:
Wieso magst du denn mit f.read(1) lesen? Und warum schreibst du den Tabulator und das Newline Zeichen in die Datei?
Hmmmm..., in der test.bin stehen nur 2 byte drin, die 9 und die 10.
Wieso kommst du jetzt auf Tabulator und Newline.?....hm..

Code: Alles auswählen

>>> chr(9)
'\t'
>>> chr(10)
'\n'
>>> 
fhoech
User
Beiträge: 143
Registriert: Montag 9. April 2007, 18:26

Du schliesst die Datei nicht, 'close' ist eine Methode, zum Aufrufen müssen also Klammern dahinter, oder besser gleich das with-Statement verwenden, damit wird die Datei automatisch geschlossen, auch im Fall eines Fehlers.
Zeichencode 9 und 10 (dezimal) sind Tab und Newline respektive, also Whitespace, da kann per 'print' nicht viel angezeigt werden :)
Vielleicht möchtest Du eher eine String-Repräsentation der Zeichen ausgeben, statt die Zeichen selbst?

Code: Alles auswählen

print "byte schreiben"
with open("test.bin", "wb") as f:
	f.write(chr(9))
	f.write(chr(10))

print "byte lesen"
with open("test.bin", "rb") as f:
	a=str(f.read(1))
	print repr(a)
	a=str(f.read(1))
	print repr(a)
(*edit*: Syntax-Highlighting korrigiert)
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Aaaaaach so.

Ne , ich will nur Binärdaten üben, weil ich da von einem Roboter 1Byte-Werte aufnehmen möchte und wiedergeben möchte.

Gruss
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Wie Printet man jetzt die Zahlenwerte?

Gruss
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

fhoech hat geschrieben:

Code: Alles auswählen

print "byte schreiben"
with open("test.bin", "wb") as f:
	f.write(chr(9))
	f.write(chr(10))

print "byte lesen"
with open("test.bin", "rb") as f:
	a=str(f.read(1))
	print repr(a)
	a=str(f.read(1))
	print repr(a)
funkheld hat geschrieben:Wie Printet man jetzt die Zahlenwerte?

Gruss
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Es kommen nur diese beiden Zeichen : '\t' '\n' und keine Zahlen.

Gruss
fhoech
User
Beiträge: 143
Registriert: Montag 9. April 2007, 18:26

funkheld hat geschrieben:Wie Printet man jetzt die Zahlenwerte?

Code: Alles auswählen

print ord(a)
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

fhoech hat geschrieben:
funkheld hat geschrieben:Wie Printet man jetzt die Zahlenwerte?

Code: Alles auswählen

print ord(a)
Hehe, ich sollte mir ne neue Brille kaufen … "Zahlenwerte" :D
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Jupp, danke. Jetzt funktioniert es wunderbar..

Jetzt möchte ich 4096 aus einer Datei auslesen in einem ByteArray und dann wieder bestimmter Werte aus dem ByteArray ausgeben. Wie geht das?

Danke.

gruss
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

funkheld hat geschrieben:Jupp, danke. Jetzt funktioniert es wunderbar..

Jetzt möchte ich 4096 aus einer Datei auslesen in einem ByteArray und dann wieder bestimmter Werte aus dem ByteArray ausgeben. Wie geht das?
Nichts für ungut, aber hast Du eigentlich mal im anderen Thread geantwortet? Ist schon wenig motivierend, wenn man sich Mühe gibt, jemandem zu helfen und sieht, dass er nun in einem anderen Thread so aktiv ist.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@funkheld: 4096 ist ein bisschen zu gross für ein Byte. Also wie steht das denn in der Datei? Zwei Bytes? Little- oder Big-Endian? Und magst Du vielleicht selber mal die Dokumentation zum `struct`-Modul lesen?
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Hm....,ich möchte 4096 einzelne Bytes aus der Datei lesen und in einem Array packen.

Gruss
BlackJack

@funkheld: Du kannst entweder bei `read()` auf der Datei angeben, dass Du 4096 Bytes in eine Zeichenkette lesen willst, Dir das `array`-Modul in der Standardbibliothek anschauen, oder eine externe Bibliothek wie `numpy` installieren. Kommt auch ein bisschen darauf an, was Du mit den Daten machen möchtest.
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Wie macht man das reinschauen dort ?
Gruss
Antworten