2009-03-17 14 views
12

मोड अजगर में, निम्नलिखित बयानों से काम नहीं करते:अजगर फ़ाइल विस्तार

f = open("ftmp", "rw") 
print >> f, "python" 

मैं त्रुटि मिलती है:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IOError: [Errno 9] Bad file descriptor 

लेकिन निम्न कोड के साथ काम करता है:

g = open("ftmp", "r+") 
print >> g, "python" 

ऐसा लगता है कि मुझे फ़ाइल मोड को संशोधित करने की आवश्यकता है। फ़ाइल खोलने के तरीके की गहरी जटिलताओं क्या हैं?

उत्तर

11

के अतिरिक्त के रूप में @Jarret Hardie's answer यहाँ है कैसे समारोह fileio_init() में अजगर की जांच फ़ाइल मोड:

s = mode; 
while (*s) { 
    switch (*s++) { 
    case 'r': 
     if (rwa) { 
     bad_mode: 
      PyErr_SetString(PyExc_ValueError, 
        "Must have exactly one of read/write/append mode"); 
      goto error; 
     } 
     rwa = 1; 
     self->readable = 1; 
     break; 
    case 'w': 
     if (rwa) 
      goto bad_mode; 
     rwa = 1; 
     self->writable = 1; 
     flags |= O_CREAT | O_TRUNC; 
     break; 
    case 'a': 
     if (rwa) 
      goto bad_mode; 
     rwa = 1; 
     self->writable = 1; 
     flags |= O_CREAT; 
     append = 1; 
     break; 
    case 'b': 
     break; 
    case '+': 
     if (plus) 
      goto bad_mode; 
     self->readable = self->writable = 1; 
     plus = 1; 
     break; 
    default: 
     PyErr_Format(PyExc_ValueError, 
       "invalid mode: %.200s", mode); 
     goto error; 
    } 
} 

if (!rwa) 
    goto bad_mode; 

यही कारण है: केवल "rwab+" वर्णों की अनुमति है; "rwa" में से एक होना चाहिए, सबसे अधिक '+' और 'b' एक नोप है।

+0

वाह, समय (* एस) और स्विच (* एस ++) कैसे काम करता है? ओओ जो मैं देखता हूं, क्या यह स्ट्रिंग चार को चार से फाड़ देगा? लेकिन * ++ का क्या अर्थ है? – Qwerty

+2

@ क्वर्टी: देखें [कैसे * * (* s ++ = * t ++) "काम करता है?] (Http://stackoverflow.com/questions/810129/how-does-whiles-t-work)' * s' को समझने के लिए , सी में '* एस ++' – jfs

17

बेहतर अभी तक, दस्तावेज़ों को आपके लिए यह करने दें: http://docs.python.org/library/functions.html#open। प्रश्न में आपका मुद्दा यह है कि कोई "आरडब्ल्यू" मोड नहीं है ... आप शायद 'आर +' चाहते हैं जैसा आपने लिखा था (या 'ए +' अगर फ़ाइल अभी तक मौजूद नहीं है)।

+12

दस्तावेज़ीकरण अपर्याप्त है। यह नहीं कहता कि आपके पास 'r' और' w' नहीं हो सकता है। यह नहीं कहता कि 'डब्ल्यू +' और 'डब्ल्यू' के बीच क्या अंतर है (वास्तव में "अपडेटिंग" मतलब क्या है?), और यह नहीं कहता कि 'ए' फ़ाइल के अंत की तलाश में है (मुझे लगता है कि यह करता है , लेकिन शायद नहीं)। और यह शुरुआत में, बिना छेड़छाड़ के, पढ़ने और लिखने के लिए फ़ाइल खोलने का एक स्पष्ट तरीका नहीं देता है। – Timmmm

0

वास्तव में, यह ठीक है, लेकिन मैं लाइनों 42 पर (S60 पर पायथन के लिए) कोड निम्नलिखित में सॉकेट पर एक "rw" मोड पाया और 45:

http://www.mobilenin.com/mobilepythonbook/examples/057-btchat.html

+0

http://docs.python.org/library/socket.html#module-socket देखें। "नोट कुछ व्यवहार प्लेटफॉर्म पर निर्भर हो सकते हैं, क्योंकि ऑपरेटिंग सिस्टम सॉकेट एपीआई में कॉल किए जाते हैं।" तो यह एक S60- विशिष्ट सुविधा की तरह लगता है। –

+0

मैं यह भी इंगित करता हूं कि आर + और ए + दोनों पढ़ने और लिखने में सक्षम हैं। आर + के साथ एक फ़ाइल खोलें, और आप फ़ाइल के आस-पास, ओवरराइटिंग या सामग्री को संलग्न करने के लिए() खोज सकते हैं। क्या ऐसी कोई सुविधा है जिसे आप उम्मीद कर रहे हैं कि '+' श्रृंखला प्रदान नहीं करती है? –

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