2013-06-12 18 views
14

Próbuję opracować narzędzie, które czyta plik binarny, wprowadza pewne zmiany i zapisuje go. Próbuję zrobić listę wszystkich linii w pliku, pracować z kilkoma liniami, a następnie ponownie dołączyć do listy.Łączenie listy bajtów z pytonem

To co próbowałem:

file = open('myFile.exe', 'r+b') 

aList = [] 
for line in f: 
    aList.append(line) 

#Here im going to mutate some lines. 

new_file = ''.join(aList) 

i dać mi ten błąd:

TypeError: sequence item 0: expected str instance, bytes found 

które ma sens, ponieważ pracuję z bajtów.

Czy istnieje sposób, w jaki mogę użyć funkcji łączenia o coś podobnego do łączenia bajtów? Dziękuję.

+0

na co warto, można zrobić 'ALIST = f.readlines()' lub 'ALIST = lista (f)' – mgilson

+0

Spróbuj: 'new_file = '\ x01'.join (aList)' – karthikr

+1

Czy ma sens mówienie o "liniach" w pliku binarnym? Zwykle dodajemy znaki nowej linii dla czytelności, co nie ma zastosowania do plików binarnych. Zastanawiam się, czy lepiej byłoby pracować z ciągami o stałej długości, jak każde 80 bajtów. (Tylko myśl.) – Rob

Odpowiedz

38

Wykonać przyłączenia na ciąg bajtów używając b''.join():

>>> b''.join([b'line 1\n', b'line 2\n']) 
b'line 1\nline 2\n' 
+0

Python rozpoznaje, kiedy pracuję z bajtami, dodając "b" obok dowolnego ciągu. To jest świetne. Dzięki. – user2130898

2

Wystarczy pracować nad swoimi "liniami" i pisać je, gdy tylko skończysz.

file = open('myFile.exe', 'r+b') 
outfile = open('myOutfile.exe', 'wb') 

for line in f: 
    #Here you are going to mutate the CURRENT line. 
    outfile.write(line) 
file.close() 
outfile.close() 
+0

Nie myślałem o tym rozwiązaniu, jest to znacznie łatwiejsze niż moje. Dzięki! – user2130898