2011-08-21 32 views
6
import hashlib 

infile = open("P:\\r.mp3", 'r+b') 
data = infile.readline() 
hash = hashlib.md5() 
hash.update(data) 

hash_digest = hash.hexdigest() 
print(hash_digest) 
#hash_digest = hash_digest.encode('utf-8') 
print(hash_digest) 
with open("lt.txt", 'ab') as outfile: 
    outfile.write(hash_digest + '\n') #error here 

with open("syncDB.txt", 'rb') as fg: 
    for data in fg: 
    print(data) 
outfile.write(hash_digest + '\n') 
TypeError: 'str' does not support the buffer interface 

Làm thế nào để sửa chữa điều đó và những gì tôi cần phải học cách nhìn thấy tôi qua những tình huống này?Lỗi Loại: 'str' không hỗ trợ giao diện đệm

Ngoài ra nếu tôi mã hóa này trong utf-8 (bỏ ghi chú) nó mang lại cho ra các lỗi sau:

TypeError: can't concat bytes to str 

Trả lời

17

Bạn đang sử dụng Python 3, nơi có một bộ phận chặt chẽ giữa văn bản (str) và dữ liệu (bytes). Không thể ghi văn bản vào tệp nếu trước tiên bạn không mã hóa văn bản.

Có hai cách để làm điều này:

1) Mở tập tin trong chế độ văn bản (có thể với một mã hóa quy định) để dây được tự động mã hóa dành cho bạn:

with open("lt.txt", 'at', encoding='utf8') as outfile: 
    outfile.write(hash_digest + '\n') # or print(hash_digest, file=outfile) 

Nếu bạn don Không chỉ định mã hóa chính bạn khi mở tệp ở chế độ văn bản, mã hóa mặc định của ngôn ngữ hệ thống của bạn sẽ được sử dụng.

2) Mã hóa các chuỗi theo cách thủ công như bạn đã thử. Nhưng đừng cố gắng trộn str với bytes như bạn đã làm, hoặc sử dụng một byte chữ:

hash_digest = hash_digest.encode('utf-8') 
with open("lt.txt", 'ab') as outfile: 
    outfile.write(hash_digest + b'\n') # note the b for bytes 

hoặc mã hóa sau khi thêm xuống dòng:

outfile.write((hash_digest + '\n').encode('utf-8')) 
+2

Bạn không cần gọi f.close() nếu bạn đang sử dụng với tính năng mở. (Tất nhiên tôi nhận ra bạn chỉ đơn giản là phù hợp với mã của OP.) – DSM

+0

Cảm ơn! Tôi đã gặp sự cố với 'csv.writer',' writer.writerow' với cùng lỗi. Tôi đã gặp phải vấn đề chuyển đổi adter từ sys.stdout sang file 'open()'. Giải pháp của bạn đã giải quyết được vấn đề của tôi :). –

-3

Bạn phải tìm kiếm trong Google cho 'str 'không hỗ trợ giao diện bộ đệm

Bạn sẽ có rất nhiều câu trả lời như thế này:

stackoverflow.com/questions/5471158/typeerror-str-does-not-support-the-buffer-interface

Và đối với lỗi thứ hai ** Lỗi Loại: không thể concat byte để str **, tôi nghĩ rằng bạn phải viết b'\n' trong f.write(hex + '\n')

""" chỉnh sửa

có Rosh nghịch lý là bên phải, b '\ n' và không phải u '\ n'

Các vấn đề liên quan