@Marie: Es liegt nicht an ``print``, sondern wie Die Fehlermeldung Dir mitteilt, dass man Objekte vom `str` und `int` nicht einfach mit ``+`` konkatenieren kann. Dazu müssen beide vom Typ `str` sein. (Oder etwas genauer: beide Untertypen von `basestring`.)
Code: Alles auswählen
In [105]: 'spam' + 42
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/home/bj/<ipython console> in <module>()
TypeError: cannot concatenate 'str' and 'int' objects
Objekte haben einen Typ und der legt fest was man mit einem Objekt machen kann. Falls Du das noch nicht getan hast, arbeite mal das Tutorial in der Python-Dokumentation durch, um Dich mit den Grundtypen und -funktionen von Python vertraut zu machen. Statt ``+`` zum Aufbauen von Zeichenketten solltest Du Dir auch besser Zeichenkettenformatierung mittels ``%``-Operator oder `format()`-Methode auf Zeichenketten angewöhnen. Damit würde ich auch eine Umwandlung von Zahlen in eine Hexadezimaldarstellung machen wenn man den '0x'-Präfix nicht haben möchte.
Es handelt sich um eine Binärdatei, da gibt es keine Zeilen, also macht `readline()` keinen Sinn. Das liest die Datei bis zum ersten Auftreten der Bytewerte die auf dem System auf dem das ausgeführt wird, in *Textdateien* ein Zeilenende markieren würden. Zum einen kann das also unterschiedliche Ergebnisse für die selbe Datei auf unterschiedlichen Systemen ergeben und zum anderen haben die Bytewerte in Binärformaten in aller Regel eine andere Bedeutung. Sie können dort zum Beispiel Bestandteil von binär kodierten Messwerten sein.
Man muss in Python keine Variablen deklarieren. Mal abgesehen davon, dass `i` gar nicht verwendet wird, sind die Zuweisungen am Anfang an `out` und `i` überflüssig.
`MyArray` wird nur verwendet um davon die Länge abzufragen — das hätte man auch mit einem Zähler machen können. Den muss man nicht einmal selber hochzählen, dafür gibt es die `enumerate()`-Funktion.
Innerhalb der Schleife werden unnötige Umwandlungen gemacht. Die hexadezimale Darstellung des Bytewertes wird nirgends tatsächlich verwendet.
'Line Number' ist semantisch falsch. Mal davon abgesehen dass es in Binärdateien, wie schon gesagt, keine Zeilen gibt, ist das hier der Byte-Versatz vom Anfang der Datei.
Falls Du Python 2.x einsetzt solltest Du die Klammern bei ``print`` weg lassen, denn dort ist das keine Funktion sondern eine Anweisung. Falls Du Python 3.x einsetzt sind die Klammern deshalb natürlich notwendig, dann solltest Du aber Leerzeichen zwischen dem Funktionsnamen und der öffnenden Klammer weg lassen, damit man das auch deutlich als Funktionsaufruf erkennen kann.
Wegen der Namensgebung und der Einrückung könntest Du mal einen Blick in
PEP 8 -- Style Guide for Python Code werfen.
Der (nicht sinvolle) Quelltext könnte vereinfacht so aussehen:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
def main():
with open('MyTest.eeg', 'rb') as eeg_file:
for i, byte in enumerate(eeg_file.readline()):
print 'Offset:%3d:%d' % (i, ord(byte))
if __name__ == '__main__':
main()