Mam listę bajtów jako liczb całkowitych, co jest czymś w rodzaju
[120, 3, 255, 0, 100]
Jak mogę zapisać tę listę do pliku jako binarną?
Czy to zadziała?
newFileBytes = [123, 3, 255, 0, 100]
# make file
newFile = open("filename.txt", "wb")
# write to file
newFile.write(newFileBytes)
TypeError: argument 1 must be string or buffer, not list
.Odpowiedzi:
To jest dokładnie to, do czego
bytearray
służy:Jeśli korzystasz z Pythona 3.x, możesz użyć
bytes
zamiast tego (i prawdopodobnie powinien, ponieważ lepiej sygnalizuje twoje zamiary). Ale w Pythonie 2.x to nie zadziała, ponieważbytes
jest to tylko alias dlastr
. Jak zwykle, pokazywanie za pomocą interaktywnego tłumacza jest łatwiejsze niż wyjaśnianie za pomocą tekstu, więc pozwól mi to zrobić.Python 3.x:
Python 2.x:
źródło
str.encode
istruct.pack
jeśli musisz pracować nad 2.2. Ale 2.6 jest niedostępny od 5 lat; wszystkie trzy systemy Ubuntu LTS są nadal obsługiwane, wszystkie trzy wersje OS X są obsługiwane, poprzednia główna wersja CentOS / RHEL itp., wszystkie są wbudowane. Jeśli potrzebujesz obsługiwać 2.5 lub 2.1 lub 1.6 lub cokolwiek innego, prawdopodobnie wiem…bytearray
nadal konwertuje\n
do\r\n
, co czyni go niezadowalającym dla danych binarnych, jeśli flaga „b” nie jest przekazywana podczas otwierania pliku.\r\n
funkcja jest częścią uniwersalnych opcji nowych linii dla tekstu.)Służy
struct.pack
do konwersji wartości całkowitych na bajty binarne, a następnie zapisz bajty. Na przykładJednak nigdy nie nadałbym plikowi binarnemu
.txt
rozszerzenia.Zaletą tej metody jest to, że działa ona również w przypadku innych typów, na przykład jeśli którakolwiek z wartości jest większa niż 255, możesz użyć
'5i'
zamiast tego formatu, aby uzyskać pełne 32-bitowe liczby całkowite.źródło
Aby przekonwertować liczby całkowite <256 na binarne, użyj
chr
funkcji. Więc patrzysz na wykonanie następujących czynności.źródło
charmap
raczej niżascii
i działa zarówno w python2, jak i python3.ascii
Kodowania działa tylko w python2.Od wersji Python 3.2+ możesz to również osiągnąć przy użyciu
to_bytes
natywnej metody int:To znaczy, każde pojedyncze wywołanie
to_bytes
w tym przypadku tworzy ciąg o długości 1, z jego znakami ułożonymi w kolejności big-endian (co jest trywialne dla łańcuchów długości 1), który reprezentuje wartość całkowitąbyte
. Możesz także skrócić ostatnie dwie linie w jedną:źródło
Możesz użyć następującego przykładu kodu przy użyciu składni Python 3:
Oto jedna linijka powłoki:
źródło
Użyj marynaty, w ten sposób: importuj marynatę
Twój kod wyglądałby tak:
Aby odczytać dane z powrotem, użyj metody pickle.load
źródło