2011-12-28 9 views
5

python3 का उपयोग करना, os.walk करने के लिए फ़ाइलों की एक निर्देशिका उम्मीद है, (स्ट्रिंग?) एक द्विआधारी वस्तु में उन्हें पढ़ने और उन पर कुछ आगे की प्रक्रिया है। पहला कदम है, हालांकि: कैसे फ़ाइल (रों) os.walk के परिणामों को पढ़ने के लिए?फ़ाइल से फ़ाइल सामग्री को कैसे पढ़ा जाए?

# NOTE: Execute with python3.2.2 

import os 
import sys 

path = "/home/user/my-files" 

count = 0 
successcount = 0 
errorcount = 0 
i = 0 

#for directory in dirs 
for (root, dirs, files) in os.walk(path): 
# print (path) 
print (dirs) 
#print (files) 

for file in files: 

    base, ext = os.path.splitext(file) 
    fullpath = os.path.join(root, file) 

    # Read the file into binary? -------- 
    input = open(fullpath, "r") 
    content = input.read() 
    length = len(content) 
    count += 1 
    print (" file: ---->",base,"/",ext," [count:",count,"]", "[length:",length,"]") 
    print ("fullpath: ---->",fullpath) 

त्रुटि:

Traceback (most recent call last): 
    File "myFileReader.py", line 41, in <module> 
    content = input.read() 
    File "/usr/lib/python3.2/codecs.py", line 300, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe2 in position 11: invalid continuation byte 

उत्तर

9

आप द्विआधारी मोड में फ़ाइल खोलने चाहिए एक बाइनरी फ़ाइल को पढ़ने के लिए। बदले

input = open(fullpath, "r") 

को

input = open(fullpath, "rb") 
पढ़ा (के परिणाम) एक बाइट() वस्तु हो जाएगा।

+0

Tks, Lennart - हाँ, यह गुप्त सॉस मैं जरूरत थी। किंडा नया पायथन 3! – DrLou

+0

यह वास्तव में अजगर है कि 3 विशिष्ट नहीं है। पाइथन 2 में 'बी' ध्वज के साथ बाइनरी फाइलों को भी खोला जाना चाहिए। –

+1

हाँ, यह सब थोड़े पीछे मुड़कर देखें तो मेरे लिए गूंगा लगता है - लेकिन यह है कि हम कैसे बेवकूफ सीखना है! आप शायद सोच रहे हैं: आरटीएफएम! मदद के लिए फिर से धन्यवाद। – DrLou

3

आपकी फ़ाइलों के कुछ द्विआधारी हैं, वे सफलतापूर्वक यूनिकोड वर्ण कि अजगर 3 दुभाषिया के सारे तार दुकान का उपयोग करता में डीकोड नहीं किया जा सकता। ध्यान दें कि पाइथन 2 और पायथन 3 के बीच एक बड़े बदलाव में स्ट्रिंग्स के प्रतिनिधित्व को एएससीआईआईआई से यूनिकोड वर्णों के माइग्रेशन में शामिल किया गया है, जिसका अर्थ है कि प्रत्येक चरित्र को केवल बाइट के रूप में नहीं माना जा सकता है (हां, पायथन 3 में टेक्स्ट स्ट्रिंग्स को 2x या 4x की आवश्यकता होती है के रूप में ज्यादा मेमोरी, अजगर 2 के रूप में स्टोर करने के लिए के रूप में UTF-8 वर्ण प्रति 4 बाइट्स) करने के लिए उपयोग करता है।

आप इस प्रकार है कि अपनी परियोजना पर निर्भर करेगा विकल्पों में से एक संख्या है:

  • बाइनरी फ़ाइलें पर ध्यान न दें, फाइल एक्सटेंशन के आधार पर फ़िल्टर,
  • बाइनरी फ़ाइलें पढ़ें और या तो डिकोडिंग अपवाद को पकड़ने अगर और जब यह तब होता है, और फ़ाइल को छोड़, या विधि इस सूत्र How can I detect if a file is binary (non-text) in python?

में वर्णित इस सिलसिले में से एक का उपयोग, आप अपने समाधान बस UnicodeDecode त्रुटि को पकड़ने और फ़ाइल को छोड़ने के लिए संपादित कर सकते हैं।

आपके निर्णय के बावजूद, यह ध्यान रखना महत्वपूर्ण है कि यदि आपके सिस्टम पर फ़ाइलों में विभिन्न वर्ण एन्कोडिंग की विस्तृत श्रृंखला है, तो आपको एन्कोडिंग निर्दिष्ट करने की आवश्यकता होगी क्योंकि पाइथन 3.0 मान लेगा कि वर्ण यूटीएफ में एन्कोड किए गए हैं -8।

एक संदर्भ के रूप में, अजगर 3 आई/ओ पर एक बड़ा प्रस्तुति: http://www.dabeaz.com/python3io/MasteringIO.pdf

+0

इस लिंक के लिए धन्यवाद, और आपकी टिप्पणियों के लिए - ये मेरी सीखने की प्रक्रिया में बहुत उपयोगी होंगे। अब तक, कम से कम, सभी फाइलें बाइनरी के रूप में आसानी से पठनीय लगती हैं। – DrLou

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