Seite 1 von 1

read() macht komische Sachen

Verfasst: Dienstag 4. Januar 2011, 17:49
von may24
Hi zusammen.
Ich bin mir nicht sicher ob es sich hier um einen Python Fehler handelt oder ob read() einfach nur komische Sachen macht.
Ich benutze Python 2.7 auf Win XP SP3 2 GB Memory

Die Kruzfassung, ich lese binär einen Header aus Datei 1, entferne den Header aus Datei 2 hänge diesen an Header 1 an und schreibe das Ganze in einen neuen File.
Die fertige Datei is jedoch jedesmal defekt. Ich habe festgestellt das Python nachdem ich den Header in das neue File geschrieben habe, einfach mal zwei Bytes dazwischen geschubst hat.
Kurzerhand habe ich mal nur den Header mir via HexEditor angeschaut und siehe da: nach 402 Bytes (0x192) wurde das Zeichen 0x0d eingefügt das im Original header an dieser Stelle nicht vorkommt.
wie kann das sein ??

Code: Alles auswählen

import sys, os, re
listOfFiles = []
header_file = open("header.bin",'rb')
a_header = header_file.read()

for root, dirs, files in os.walk('.'):
	for items in files:
		fullPathName = os.path.join(root,items)
		if ( fullPathName.endswith(".jpg") ):
			listOfFiles.append(fullPathName)

for item in listOfFiles:
	try:	
		new_filename = "n_" + str(item)[2:]
		print "creating new file: ", new_filename 

		new_file = open(new_filename, 'w')
		new_file.write(a_header)
		new_file.close()
		#new_file = open(new_filename, 'a')
		#old_file = open(item, 'rb+')
		#old_file.seek(0x14)
		#tmp_oldfile = old_file.read()
		#new_file.write(tmp_oldfile)
		#new_file.close

	except IOError:
		print sys.exc_info()
Nachtrag: Es spielt übrigens keine Rolle ob man die exakte Bytegröße angibt. Es sind werden immer zu viele geschrieben.

Re: read() macht komische Sachen

Verfasst: Dienstag 4. Januar 2011, 18:14
von BlackJack
@may24: Das ist nicht die Schuld von `read()` -- noch nicht einmal die von Python: Das ist Windows. Das macht einen Unterschied zwischen Text- und Binärdateien. Wenn Du also Binärdateien verarbeitest, musst Du diese immer im Binärmodus öffnen. Sonst hört Windows bei bestimmten Bytewerten einfach auf zu lesen und ersetzt einzelne '\n'-Werte durch '\r\n'-Sequenzen.

Re: read() macht komische Sachen

Verfasst: Dienstag 4. Januar 2011, 18:50
von cofi
Im Klartext: Du willst ein 'b' in Zeile 17 ergaenzen.

Und zur Dateibehandlung: Nutze bitte `with` oder `try .. finally` kein blankes `open .. close`.