2009-07-29 13 views
19

official documentation for TemporaryFile पढ़ता है: करने के लिएपायथन - tempfile.TemporaryFile पढ़ा नहीं जा सकता है; क्यूं कर?

मोड पैरामीटर चूक 'w + बी' फ़ाइल बनाई ताकि पढ़ा जा सकता है और बंद किया जा रहा बिना लिखा।

फिर भी, नीचे दिए गए कोड अपेक्षा के अनुरूप काम नहीं करता है:

import tempfile 

def play_with_fd(): 
    with tempfile.TemporaryFile() as f: 
     f.write('test data\n') 
     f.write('most test data\n') 

     print 'READ:', f.read() 

     f.write('further data') 

     print 'READ:', f.read() 

     f.write('even more') 
     print 'READ:', f.read() 

     print 'READ:', f.read() 
     print 'READ:', f.read() 

if __name__ == '__main__': 
    play_with_fd() 

उत्पादन मैं मिलता है:

> python play.py 
READ: 
READ: 
READ: 
READ: 
READ: 

किसी को भी इस व्यवहार की व्याख्या कर सकते हैं? क्या अस्थायी फ़ाइलों से पढ़ने का कोई तरीका है? (निम्न-स्तरीय mkstemp का उपयोग किए बिना जो फ़ाइलों को स्वचालित रूप से हटा नहीं देगा; और मुझे नामित फ़ाइलों की परवाह नहीं है)

+1

'फ्लश' का उपयोग करने से मदद नहीं मिली। –

उत्तर

35

आप फ़ाइल (इस फ़ाइल की शुरुआत करने के लिए आप भेज देंगे) को पढ़ने के लिए प्रयास करने से पहले करना होगा

f.seek(0) 

, और

f.seek(0, 2) 

अंत करने के लिए वापस जाने के लिए तो आपको आश्वस्त कर सकता आप इसे ओवरराइट नहीं करेंगे।

+17

'f.seek (0, 2) 'के बजाय मैं' f.seek (0, os.SEEK_END) ' –

+0

का उपयोग करता था इतना उलझन में था कि मैं कुछ भी पढ़ नहीं सकता था,' हटा 'के साथ गड़बड़ करना शुरू कर दिया = सही 'और' कोशिश करें ... अंत में: os.remove() '... सब क्योंकि मैं 'os.seek()' के बारे में भूल गया था! कोड की 10 बदसूरत लाइनों को बचाया – dwanderson

7

read() कुछ भी वापस नहीं करता है क्योंकि आप फ़ाइल के अंत में हैं। read() पहले कुछ भी वापस करने से पहले आपको seek() पर कॉल करने की आवश्यकता है। अंत करने के लिए seek() को

f.seek(-10, 1) 

बेशक, फिर से लिखने से पहले, सुनिश्चित हो (यदि यह है कि जहां के लिए लिख जारी रखना चाहते हैं): उदाहरण के लिए, पहले read() के सामने इस लाइन डाल दिया।

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