2013-06-09 14 views
18
import save 

string = "" 

with open("image.jpg", "rb") as f: 
    byte = f.read(1) 
    while byte != b"": 
     byte = f.read(1) 
     print ((byte)) 

Dostaję bajtów jak:Python pozbyć bajtów b” '

b'\x00'

Jak mogę pozbyć się tego b''?

Załóżmy, że chcę zapisać bajty na liście, a następnie zapisać tę listę ponownie jako ten sam obraz. Jak mogę kontynuować?

Dzięki!

+1

Opcja 'B' oznacza to bajt ... nie chcesz się go pozbyć ... – Ben

+7

' byte.decode („ascii”) 'jeśli wiesz, że przedsta bajtowych ts znak ASCII – Pithikos

+0

@Pithikos bytes.decode ('ascii'), aby go poprawić. – Doruk

Odpowiedz

4

B "..." jest po prostu notacją pseudonową ciągów bajtowych, tak naprawdę tam nie ma, jest tylko drukowana. Czy powoduje to prawdziwe problemy?

+1

Kiedy zapisuję go do pliku txt, zapisuje go przy użyciu b '' –

+0

Widzę, że zapisujesz go jako ciąg znaków.Jeśli to jest problem, to str (byte) [1:] powinien usunąć 'b' – jureslak

+0

co [1:] menas? –

2

Do operowania na danych binarnych można użyć wartości array-module. Poniżej znajduje się iterator, który działa na 4096 porcjach danych zamiast czytać wszystko do pamięci w uncji.

import array 

def bytesfromfile(f): 
    while True: 
     raw = array.array('B') 
     raw.fromstring(f.read(4096)) 
     if not raw: 
      break 
     yield raw 

with open("image.jpg", 'rb') as fd 
    for byte in bytesfromfile(fd): 
     for b in byte: 
      # do something with b 
2

Jest to jeden ze sposobów, aby pozbyć się b'':

import sys 
print(b) 

Jeśli chcesz zapisać bajtów później jest bardziej wydajny, aby przeczytać cały plik za jednym razem zamiast budowania listy, tak:

with open('sample.jpg', mode='rb') as fh: 
    content = fh.read() 
    with open('out.jpg', mode='wb') as out: 
     out.write(content) 
3

b'' jest tylko reprezentacja ciąg danych, które są zapisywane Gdy print go.

Korzystanie decode nie pomoże tu, bo chcą tylko bajty, a nie postaci, które reprezentują. Przecinanie reprezentacji napisów pomoże jeszcze mniej, ponieważ nadal pozostaje ci ciąg kilku bezużytecznych znaków ("\", "x" itd.), A nie oryginalne bajty.

Nie ma potrzeby modyfikowania reprezentacji ciągów danych, ponieważ dane nadal istnieją. Po prostu użyj go zamiast ciągu (tzn. Nie używaj print). Jeśli chcesz skopiować dane, można po prostu zrobić:

data = file1.read(...) 
... 
file2.write(data) 

Jeśli chcesz wstawić dane binarne bezpośrednio z programu, należy użyć sys.stdout.buffer:

import sys 

sys.stdout.buffer.write(data) 
-3

Tu jest jedno rozwiązanie

print(str(byte[2:-1]))

+1

To jest wadliwe. Masz na myśli 'str (byte) [2: -1]' (zauważ różne rozmieszczenie nawiasów). Jednak nawet po poprawieniu nie jest to bardzo zgodny/zgodny z przeszłością lub przejrzysty/konserwowalny sposób, aby to zrobić. – jez

Powiązane problemy