read() macht komische Sachen

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.
Antworten
may24
User
Beiträge: 27
Registriert: Montag 7. September 2009, 17:14

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.
Zuletzt geändert von Anonymous am Dienstag 4. Januar 2011, 18:17, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Im Klartext: Du willst ein 'b' in Zeile 17 ergaenzen.

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