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)) 

Tôi nhận được byte như:Python thoát khỏi byte b''

b'\x00'

Làm thế nào để thoát khỏi b'' này?

Giả sử tôi muốn lưu các byte vào danh sách, sau đó lưu danh sách này lại dưới dạng hình ảnh. Làm cách nào để tiếp tục?

Cảm ơn!

+1

'b' có nghĩa là một byte ... bạn không muốn loại bỏ nó ... – Ben

+7

' byte.decode ('ascii') 'nếu bạn biết rằng byte represen ts một ký tự ASCII – Pithikos

+0

@Pithikos bytes.decode ('ascii'), để sửa nó. – Doruk

Trả lời

4

B "..." chỉ là một ký hiệu python của chuỗi byte, nó không thực sự ở đó, nó chỉ được in. Nó có gây ra một số vấn đề thực sự cho bạn?

+1

Khi tôi lưu nó vào một txt nó tiết kiệm với các b '' –

+0

Tôi thấy, bạn đang lưu nó như là chuỗi.Nếu đó là vấn đề sau đó str (byte) [1:] nên loại bỏ 'b' – jureslak

+0

những gì các [1:] Menas? –

12

Bạn có thể sử dụng chức năng bytes.decode nếu bạn thực sự cần phải "thoát khỏi b": http://docs.python.org/3.3/library/stdtypes.html#bytes.decode

Nhưng có vẻ như từ mã của bạn mà bạn không thực sự cần phải làm điều này, bạn thực sự cần phải làm việc với byte.

+1

Tôi đã thử giải mã ('utf-8') và nó không hoạt động –

+1

Vui lòng hiển thị mã. – mishik

2

Để hoạt động trên dữ liệu nhị phân, bạn có thể sử dụng array-module. Dưới đây bạn sẽ tìm thấy một trình lặp hoạt động trên 4096 khối dữ liệu thay vì đọc tất cả mọi thứ vào bộ nhớ tại ounce.

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

Đây là một cách để thoát khỏi b'':

import sys 
print(b) 

Nếu bạn muốn lưu các byte sau đó là hiệu quả hơn để đọc toàn bộ tập tin trong một đi chứ không phải là xây dựng một danh sách, như thế này:

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

các b'', chỉ là chuỗi đại diện của dữ liệu được viết khi bạn print nó.

Sử dụng decode sẽ không giúp bạn ở đây vì bạn chỉ muốn byte, chứ không phải các ký tự mà chúng đại diện. Việc cắt bớt biểu diễn chuỗi sẽ giúp thậm chí ít hơn bởi vì sau đó bạn vẫn còn lại với một chuỗi các ký tự vô dụng ('\', 'x', vv), không phải là các byte gốc.

Không cần sửa đổi biểu diễn chuỗi dữ liệu, vì dữ liệu vẫn ở đó. Chỉ cần sử dụng nó thay vì chuỗi (ví dụ: không sử dụng print). Nếu bạn muốn sao chép dữ liệu, bạn chỉ có thể làm:

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

Nếu bạn muốn xuất dữ liệu nhị phân trực tiếp từ chương trình của bạn, sử dụng sys.stdout.buffer:

import sys 

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

Dưới đây là một giải pháp

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

+1

Đó là thiếu sót. Bạn có nghĩa là 'str (byte) [2: -1]' (lưu ý vị trí khung khác nhau). Tuy nhiên, ngay cả khi được sửa chữa, nó không phải là một cách tương thích/tương thích ngược, hoặc trong suốt/có thể duy trì, để thực hiện nó. – jez