2010-11-06 5 views
9

मैं आउटपुट (contents) को एक फ़ाइल में सहेजना चाहता हूं (इसे यूटीएफ -8 में सहेजना)। फ़ाइल को अधिलेखित नहीं किया जाना चाहिए, इसे एक नई फ़ाइल के रूप में सहेजा जाना चाहिए - उदा। file2.txt तो, मैं file.txt खोलता हूं, इसे यूटीएफ -8 में एन्कोड करता हूं, कुछ सामान करता हूं और फिर इसे यूटीएफ -8 में file2.txt पर सहेजना चाहता हूं। मैं यह कैसे करु?एक .txt फ़ाइल (यूटीएफ -8) पर लिखना, पायथन

import codecs 
def openfile(filename): 
    with codecs.open(filename, encoding="UTF-8") as F: 
     contents = F.read() 
     ... 
+0

"फ़ाइल को ओवरराइट नहीं किया जाना चाहिए"। यदि आप एक फाइल पढ़ रहे हैं और एक नई फाइल लिख रहे हैं तो केवल एक ही खुला क्यों है? –

+0

क्योंकि यह एक अधूरा कोड है। ... – Gusto

+0

"क्योंकि यह एक अधूरा कोड है"? क्या? "अधूरा" आपकी आवश्यकताओं और आपके कोड के बीच विसंगति के लिए एक अच्छा स्पष्टीकरण नहीं है। केवल एक खुला क्यों है? अपनी आवश्यकताओं को थोड़ा बेहतर तरीके से मेल करने के लिए कृपया अपना कोड ठीक करें। –

उत्तर

16

कम रास्ता:

file('file2.txt','w').write(file('file.txt').read().encode('utf-8')) 

लंबा रास्ता:

data = file('file.txt').read() 
... process data ... 
data = data.encode('utf-8') 
file('file2.txt','w').write(data) 

और का उपयोग कर 'कोडेक्स' स्पष्ट रूप से:

codecs.getwriter('utf-8')(file('/tmp/bla3','w')).write(data) 
+0

नोटपैड में खोले जाने पर फ़ाइल 'file2.txt' utf-8 एन्कोडेड नहीं है, संभवतः क्योंकि मैंने कोडेक्स (आयात कोडेक्स) का उपयोग करके डेटा को डीकोड किया है और इसे फ़ाइल में सहेजते समय एक अलग तरीके का उपयोग करते हैं जैसा कि आपने सुझाव दिया था (एन्कोड का उपयोग करना तरीका)। यह सवाल है कि मैं कोडेक्स का उपयोग करके इसे कैसे एन्कोड कर सकता हूं? – Gusto

+0

@ गुस्टो - मैंने एक अलग विधि जोड़ा, हालांकि यह पूरी तरह समतुल्य है। नोटपैड में आप कैसे देख सकते हैं कि फ़ाइल utf-8 एन्कोड नहीं है? नोटपैड वास्तव में आपके लिए डिकोडिंग करता है। – adamk

+0

मैं इसे देख सकता हूं क्योंकि सिरिलिक वर्ण ठीक से प्रदर्शित नहीं होते हैं, मुझे नोटपैड एन्कोडर का उपयोग करके इसे मैन्युअल रूप से डीकोड करना होगा। पीएस नोटपैड ++ – Gusto

2

खुला एक दूसरे फ़ाइल। यदि आवश्यकता हो तो contextlib.nested() का उपयोग करें। सामग्री की प्रतिलिपि बनाने के लिए shutil.copyfileobj() का उपयोग करें।

9

मुझे इस तरह की स्थितियों में चिंताओं को अलग करना पसंद है - मुझे लगता है कि यह वास्तव में कोड क्लीनर को बनाए रखने में आसान बनाता है, और अधिक कुशल हो सकता है।

यहां आपको 3 चिंताएं हैं: यूटीएफ -8 फ़ाइल पढ़ना, लाइनों को संसाधित करना और यूटीएफ -8 फ़ाइल लिखना। मान लें कि आपकी प्रसंस्करण लाइन-आधारित है, यह पूरी तरह से पाइथन में काम करती है, क्योंकि फ़ाइल की रेखाओं पर खुलने और पुनरावृत्ति करने से भाषा में बनाया जाता है। साथ ही स्पष्ट होने के नाते, यह भी अधिक कुशल है क्योंकि यह आपको बड़ी फ़ाइलों को संसाधित करने की अनुमति देता है जो स्मृति में फिट नहीं होते हैं। अंत में, यह आपको अपने कोड का परीक्षण करने का एक शानदार तरीका प्रदान करता है - क्योंकि प्रसंस्करण फ़ाइल से अलग किया जाता है, यह आपको यूनिट परीक्षण लिखने देता है, या यहां तक ​​कि केवल पाठ पाठ पर प्रसंस्करण कोड चलाता है और फ़ाइलों के साथ झुकाव के बिना आउटपुट की मैन्युअल रूप से समीक्षा करता है।

मैं उदाहरण के प्रयोजनों के लिए लाइनों को ऊपरी मामले में परिवर्तित कर रहा हूं - संभवतः आपकी प्रसंस्करण अधिक दिलचस्प होगी। मुझे उपज का उपयोग करना पसंद है - यह प्रसंस्करण के लिए अतिरिक्त लाइनों को हटाने या डालने में आसान बनाता है हालांकि इसका उपयोग मेरे छोटे उदाहरण में नहीं किया जा रहा है।

def process(lines): 
    for line in lines: 
     yield line.upper() 

with codecs.open(file1, 'r', 'utf-8') as infile: 
    with codecs.open(file2, 'w', 'utf-8') as outfile: 
     for line in process(infile): 
      outfile.write(line) 

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

  • कोई संबंधित समस्या नहीं^_^