2017-03-06 11 views
0

Ich habe eine Byte-Datei, die aus Ganzzahlen besteht, die jeweils 4 Byte Speicherplatz belegen. Ich habe auch Funktion in meinem Python-Code, der zwei Elemente in der Datei aufgrund ihrer Indizes wechseln soll.Wie tausche ich bestimmte Bytes in einer Datei mit Python?

index 0 ist die erste 4-Byte-Ganzzahl, Index 1 ist die zweite Menge von 4 Bytes und so weiter.

Wie würde ich dies in meinem Code implementieren?

Ich bin auf beiden fest - Decodierung und dann nur die Änderungen zurückschreiben. Ich dachte, ich könnte fileinput verwenden, um diese einzelne lange Zeile als String zu verarbeiten, aber ich bin mir nicht sicher, ob das der beste Weg ist. Wenn ich dies als eine Zeichenfolge verarbeite, bin ich mir nicht sicher, wie ich die Zeichenfolge zurück in Bytes decodiere und dann wieder richtig in die Zeichenfolge zurückdekodiere.

EDIT: Ist struct.unpack und die bequeme Möglichkeit, Datei zu öffnen, ein Weg zu gehen?

Antwort

0

Das funktionierte:

def swap_in_file_array(filename, a_ind, b_ind): 
    with open(filename, "r+b") as file: 
     data = file.read() 
     tuples = [data[i:i+4] for i in range(0, len(data), 4)] 
     a = [] 
     b = [] 
     for i in range(0, (len(tuples))): 
      if i == a_ind: 
       a = tuples[i] 
       # print(struct.unpack("i", tupples[i])[0]) # also used for displaying things if needed 
      elif i == b_ind: 
       b = tuples[i] 
     tuples[b_ind] = a 
     tuples[a_ind] = b 
     data = b''.join(tuples) 
     file.seek(0) 
     file.write(data) 
     file.close() 

Ich bin sicher, dass einige andere Code Zauberer effizienter dieser Code gemacht haben könnte, aber ich bin gut mit ihm, wie es ist.

0

Ich würde mmap für so etwas verwenden. mmap.mmap() gibt ein Bytearray-Objekt zurück, das Sie indizieren können.

+0

Ich löste das auf eine andere Weise, die für einen Neuling wie mich "transparenter" ist. Trotzdem, danke! –

Verwandte Themen