2011-08-21 26 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 

मैं ऐसा कैसे को सही है और क्या मैं इन परिस्थितियों के माध्यम से मुझे देखने के लिए सीखने की जरूरत है ऐसा करने का समर्थन नहीं करता?लेखन त्रुटि: 'str' बफर इंटरफ़ेस

इसके अलावा, अगर मैं इस सांकेतिक शब्दों में बदलना utf-8 (टिप्पणी हटाएं) यह निम्न त्रुटि बाहर देता है:

TypeError: can't concat bytes to str 

उत्तर

17

आप अजगर 3, जहां पाठ (str) और डेटा के बीच एक सख्त विभाजन है का उपयोग कर रहे (bytes)। पाठ को फ़ाइल में नहीं लिखा जा सकता है यदि आप पहले इसे स्पष्ट रूप से एन्कोड नहीं करते हैं।

ऐसा करने के दो तरीके हैं:

1) (एन्कोडिंग संभवतः के साथ निर्दिष्ट) पाठ मोड में फ़ाइल खोलें ताकि तार अपने आप आपके लिए इनकोड: यदि आपके पास

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

पाठ मोड में फ़ाइल खोलते समय एन्कोडिंग स्वयं निर्दिष्ट नहीं करते हैं, आपके सिस्टम लोकेल का डिफ़ॉल्ट एन्कोडिंग उपयोग किया जाएगा।

2) तारों को मैन्युअल रूप से एन्कोड करें जैसे आपने कोशिश की। लेकिन जैसे तुमने किया था bytes साथ str मिश्रण करने की कोशिश नहीं करते हैं, या तो एक बाइट शाब्दिक का उपयोग करें:

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

यदि आप खुले-साथ-साथ उपयोग कर रहे हैं तो आपको f.close() को कॉल करने की आवश्यकता नहीं है। (बेशक मुझे एहसास है कि आप बस ओपी के कोड से मेल खाते थे।) – DSM

+0

धन्यवाद! मुझे 'csv.writer',' writer.writerow' के साथ एक ही त्रुटि के साथ समस्या थी। मुझे sys.stdout से 'open()' फ़ाइल में एडटर स्विचिंग में समस्याएं आ रही हैं। आपके समाधान ने मेरी समस्याओं का समाधान किया :)। –

-3

आप 'str के लिए गूगल खोज करना होगा:

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 

या एनकोड न्यू लाइन को जोड़ने के बाद 'बफर इंटरफ़ेस

आप इस तरह के बहुत सारे जवाब होगा समर्थन नहीं करता:

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

और दूसरा त्रुटि के लिए ** लेखन त्रुटि: बाइट्स concat नहीं कर सकते str को **, मुझे लगता है कि आप f.write(hex + '\n')

में b'\n' लिखना चाहिए "" "संपादित

हाँ रोश आक्सीमोरण है दाएं, बी '\ n', और नहीं '\ n'

संबंधित मुद्दे