की तलाश () समारोह?


127

कृपया यहाँ मेरी उलझन को क्षमा करें, लेकिन मैंने अजगर में () का उपयोग करने के बाद () का उपयोग करने के बारे में दस्तावेज़ीकरण पढ़ा है (हालांकि इसका उपयोग करने में मदद मिली) और इससे मुझे मदद मिली कि मैं अभी भी इसके वास्तविक अर्थ पर थोड़ा उलझन में हूं, यह कोई स्पष्टीकरण है। सराहना की, धन्यवाद।

जवाबों:


234

के बारे में seek()चिंता करने के लिए बहुत ज्यादा नहीं है।

सबसे पहले, यह एक खुली फ़ाइल पर काम करते समय उपयोगी है।

यह ध्यान रखना महत्वपूर्ण है कि इसका सिंटैक्स निम्नानुसार है:

fp.seek(offset, from_what)

जहां fpफ़ाइल सूचक आप के साथ काम कर रहे हैं; offsetआप कितने पदों पर जाएंगे; from_whatअपनी बात को परिभाषित करता है:

  • 0 : इसका मतलब है कि आपका संदर्भ बिंदु फ़ाइल की शुरुआत है
  • 1 : का अर्थ है कि आपका संदर्भ बिंदु वर्तमान फ़ाइल स्थिति है
  • 2 : इसका मतलब है कि आपका संदर्भ बिंदु फ़ाइल का अंत है

छोड़ दिया गया है, तो from_whatचूक 0 से।

यह कभी न भूलें कि फाइलों का प्रबंधन करते समय, उस फाइल के अंदर हमेशा एक स्थिति होगी जहां आप वर्तमान में काम कर रहे हैं। जब बस खुला, वह स्थिति फ़ाइल की शुरुआत है, लेकिन जैसा कि आप इसके साथ काम करते हैं, आप आगे बढ़ सकते हैं।
seekआप के लिए उपयोगी होगा जब आप walkउस खुली फ़ाइल के साथ की जरूरत है , बस एक पथ के रूप में आप यात्रा कर रहे हैं।


115
दूसरा पैरामीटर समझा, हालांकि मैं जोड़ने के लिए है कि आप शायद स्थिरांक का उपयोग करना चाहिए करना चाहते हैं के लिए +1 os.SEEK_SET, os.SEEK_CURऔर os.SEEK_ENDबजाय जादू नंबरों की 0, 1है, और 2, क्रमशः।
आर्टऑफवर्फ

सीक पोजीशन फ़ाइल की सामग्री में एक बाइट इंडेक्स है जो एक सरणी इंडेक्स के समान है। यह भी दिलचस्प है कि अगर हम 'मोड' ए में फाइल खोलते हैं, तो हम फाइल की शुरुआत नहीं कर सकते।
अनिलमोर

3
वास्तव में अपेंड मोड के मामले में, हम fp.seek (0, 0) का उपयोग करके फ़ाइल की शुरुआत करने की कोशिश कर सकते हैं, लेकिन जैसे ही आप उस फ़ाइल को लिखने का प्रयास करते हैं, फिर से फ़ाइल के अंत में रीसेट हो जाएगा और अंत में सामग्री लिखी जाएगी। ।
अनिलमोर

1
धन्यवाद - कुछ नया सीखा और केवल इस स्पष्ट रूप से समझाया गया उत्तर प्याज पढ़ना था
एडम ह्यूजेस

फ़ाइल की शुरुआत से कॉल करते समय, क्या यह वास्तव में हर बार फ़ाइल की शुरुआत से 'मांगना' शुरू करता है?
थियो स्टेफौ

40

जब आप कोई फ़ाइल खोलते हैं, तो सिस्टम फ़ाइल की शुरुआत की ओर इशारा करता है। आपके द्वारा किया गया कोई भी पढ़ना या लिखना शुरू से ही होगा। एक seek()ऑपरेशन उस पॉइंटर को फाइल के किसी अन्य हिस्से में ले जाता है ताकि आप उस स्थान पर पढ़ सकें या लिख ​​सकें।

इसलिए, यदि आप पूरी फ़ाइल पढ़ना चाहते हैं, लेकिन पहले 20 बाइट्स को छोड़ दें, तो फ़ाइल को खोलें, seek(20)जहाँ आप पढ़ना शुरू करना चाहते हैं, वहाँ जाएँ, फिर फ़ाइल को पढ़ना जारी रखें।

या यूं कहें कि आप हर 10 वीं बाइट को पढ़ना चाहते हैं, आप एक लूप लिख सकते हैं seek(9, 1)जो वर्तमान स्थितियों के सापेक्ष 9 बाइट्स को आगे बढ़ाता है), read(1)(एक बाइट को पढ़ता है), दोहराता है।


14
-1: यह उत्तर दूसरे पैरामीटर की व्याख्या करने में विफल रहता है, और वास्तव में, वाक्यांशबद्ध के रूप में, ऐसा लगता है कि दूसरा पैरामीटर यह निर्धारित करता है कि कितने बाइट्स पढ़े गए हैं।
आर्टऑफवर्फ

3

seekके अपेक्षानुसार काम करें एक ऑफसेट बाइट में।

Ascii फाइल उदाहरण:

तो अगर आपके पास निम्नलिखित सामग्री के साथ एक पाठ फ़ाइल है:

simple.txt

abc

आप निम्न के रूप में पहले चरित्र पर छोड़ करने के लिए 1 बाइट कूद सकते हैं :

fp = open('simple.txt', 'r')
fp.seek(1)
print fp.readline()
>>> bc

बाइनरी फ़ाइल उदाहरण सभा चौड़ाई:

fp = open('afile.png', 'rb')
fp.seek(16)
print 'width: {0}'.format(struct.unpack('>i', fp.read(4))[0])
print 'height: ', struct.unpack('>i', fp.read(4))[0]

नोट: एक बार जब आप कॉल readकरते हैं तो आप रीड-हेड की स्थिति बदल रहे होते हैं, जो कार्य करता है seek


0

स्ट्रिंग के लिए, WHENCE का उपयोग करने के बारे में भूल जाएं: फ़ाइल की शुरुआत में स्थिति के लिए f.seek (0) का उपयोग करें और फ़ाइल के अंत में स्थिति के लिए f.seek (len (f) +1) का उपयोग करें। फ़ाइल में कहीं भी पढ़ने / लिखने के लिए खुले (फ़ाइल, "आर +") का उपयोग करें। यदि आप "a +" का उपयोग करते हैं, तो आप केवल कर्सर के स्थान पर ध्यान दिए बिना फ़ाइल के अंत में (परिशिष्ट) लिख सकेंगे।


क्या आप फ़ाइलों या स्ट्रिंग्स के बारे में बात कर रहे हैं?
राल्फफ्राइडल

गलतफहमी के लिए खेद है। यह सब फाइलों के बारे में है।
गॉर्डन ग्राहम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.