2013-08-31 4 views
37

तो फाइलों को सृजित करने के लिए मैं निम्नलिखित का उपयोग करें। अगले चरण में मैं फ़ाइल को संसाधित करता हूं। कार्यक्रम के अंत में, मैं एक "भौतिक फ़ाइल" के साथ समाप्त होता हूं जिसे मुझे हटाने की आवश्यकता है।आभासी फ़ाइल प्रसंस्करण कैसे करें?</p> <pre><code>fileHandle = open('fileName', 'w') </code></pre> <p>तो, फ़ाइल में सामग्री लिखने फ़ाइल को बंद करें:

क्या कोई "वर्चुअल" फ़ाइल लिखने का कोई तरीका है जो "भौतिक" की तरह व्यवहार करता है (इसे उसी तरह से छेड़छाड़ करने की इजाजत देता है) लेकिन पाइथन में दौड़ के अंत में मौजूद नहीं है?

उत्तर

40

आप tempfile.SpooledTemporaryFile का उपयोग करने पर विचार करना चाहेंगे जो आपको इस दुनिया में सबसे अच्छी तरह से समझता है कि यह प्रारंभ में एक अस्थायी स्मृति-आधारित वर्चुअल फ़ाइल बनाएगा लेकिन स्वचालित रूप से भौतिक डिस्क-आधारित फ़ाइल पर स्विच हो जाएगा स्मृति में एक निर्दिष्ट आकार से अधिक है।

एक और अच्छा विशेषता यह है कि (जब स्मृति का प्रयोग करके) यह स्वचालित रूप से या तो एक io.BytesIO या io.StringIO आप या तो पढ़ सकते हैं और यह करने के लिए यूनिकोड तार या बाइनरी डेटा (बाइट्स) लिखने के लिए क्या किया जा रहा है mode इस्तेमाल की इजाजत दी पर निर्भर करता है प्रयोग करेंगे।

एकमात्र मुश्किल हिस्सा यह तथ्य हो सकता है कि आपको चरणों के बीच फ़ाइल को बंद करने से बचने की आवश्यकता होगी क्योंकि ऐसा करने से इसे स्मृति या डिस्क से हटा दिया जाएगा। इसके बजाय आप इसे seek(0) विधि कॉल फ़ाइल के साथ शुरुआत में वापस कर सकते हैं।

जब आप पूरी तरह से फ़ाइल के साथ पूर्ण होते हैं और इसे बंद करते हैं, तो डेटा में डेटा की मात्रा को भौतिक फ़ाइल में घुमाए जाने पर इसे स्वचालित रूप से डिस्क से हटा दिया जाएगा।

+0

प्रासंगिक उदाहरण: https://stackoverflow.com/questions/8577137/creating-a-tmp-file-in-python –

41

io मॉड्यूल में आपके पास StringIO और BytesIO है।

StringIO बर्ताव पाठ मोड में खोला एक फ़ाइल की तरह - पढ़ने और यूनिकोड तार लेखन (io.open(filename, mode, encoding='...') के साथ एक फ़ाइल को खोलने के बराबर), और BytesIO बर्ताव करता है द्विआधारी मोड (mode='[rw]b') में खोला गया एक फ़ाइल की तरह है, और लिखने बाइट्स पढ़ सकते हैं।

अजगर 2:

In [4]: f = io.BytesIO('test') 
In [5]: type(f.read()) 
Out[5]: str 
In [6]: f = io.StringIO(u'test') 
In [7]: type(f.read()) 
Out[7]: unicode 

अजगर 3:

In [2]: f = io.BytesIO(b'test') 
In [3]: type(f.read()) 
Out[3]: builtins.bytes 
In [4]: f = io.StringIO('test') 
In [5]: type(f.read()) 
Out[5]: builtins.str 
+8

यह ध्यान दिया जाना चाहिए कि आपको फ़ाइल नामों के लिए कोड के साथ इंटरफ़ेस की आवश्यकता होनी चाहिए, तो: [यदि आपके सभी विरासत कोड एक फ़ाइल नाम ले सकते हैं, तो 'स्ट्रिंगियो' उदाहरण जाने का तरीका नहीं है। इसके बजाय एक अस्थायी फ़ाइल नाम उत्पन्न करने के लिए 'tempfile' मॉड्यूल का उपयोग करें।] (Http: // stackoverflow।कॉम/प्रश्न/11892623/पायथन-स्ट्रिंगियो-एंड-संगतता-साथ-कथन-संदर्भ-प्रबंधक/11892712 # 11892712) – sdaau

8

आप एक आभासी फ़ाइल के रूप में उपयोग कर सकते हैं StringIO से आधिकारिक documentation

import StringIO 

output = StringIO.StringIO() 
output.write('First line.\n') 
print >>output, 'Second line.' 

# Retrieve file contents -- this will be 
# 'First line.\nSecond line.\n' 
contents = output.getvalue() 

# Close object and discard memory buffer -- 
# .getvalue() will now raise an exception. 
output.close() 
+7

याद रखें, अगर आप इसे किसी अन्य फ़ंक्शन पर पास करना चाहते हैं, तो फ़ाइल जैसी ऑब्जेक्ट के रूप में, आपको चाहिए वर्चुअल फ़ाइल को रिवाइंड करें: output.seek (0) – RufusVS

+0

मैन, क्या आप आधिकारिक दस्तावेज़ीकरण से प्रतिलिपि बना रहे हैं? :) मुझे लगता है कि ऐसे मामलों में एक लिंक का उपयोग करना उचित है। – maxadamo

+0

@maxadamo हो गया। धन्यवाद। –

0

वहाँ StringIO मॉड्यूल है , its documentation पढ़ें, इसे उपयोग करना आसान होना चाहिए।

ध्यान रखें, हालांकि, यह "फ़ाइल की" सामग्री को स्मृति में रखेगा। यदि आपके पास बहुत अधिक डेटा है, तो शायद वास्तविक फ़ाइल बनाने के लिए बेहतर होगा, उदा। में/tmp, और बाद में इसे हटा दें।

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