2015-02-07 7 views
10

मैं फ़ाइल में एक स्ट्रिंग को जोड़ने की कोशिश कर रहा हूं, यदि स्ट्रिंग फ़ाइल में बाहर नहीं निकलती है। हालांकि, a+ विकल्प वाली फ़ाइल खोलने से मुझे एक बार में ऐसा करने की अनुमति नहीं मिलती है, क्योंकि a+ के साथ फ़ाइल खोलने से पॉइंटर फ़ाइल के अंत में रखेगा, जिसका अर्थ है कि मेरी खोज हमेशा विफल हो जाएगी। फ़ाइल को खोलने के पहले फ़ाइल को खोलने के अलावा इसे करने के लिए कोई अच्छा तरीका है, जोड़ने के लिए फिर से बंद करें और खोलें?पायथन: फ़ाइल खोलें, फिर खोज करें, अगर मौजूद नहीं है

कोड में, जाहिर है, नीचे काम नहीं करता है।

file = open("fileName", "a+") 

मुझे इसे प्राप्त करने के लिए निम्नलिखित करने की आवश्यकता है।

file = open("fileName", "r") 
... check if a string exist in the file 
file.close() 

... if the string doesn't exist in the file 
file = open("fileName", "a") 
file.write("a string") 
file.close() 
+2

आपको जो चाहिए वह तलाश ऑपरेशन है http://www.tutorialspoint.com/python/file_seek.htm –

+1

क्या आप एक सबस्ट्रिंग, लाइन या वास्तविक शब्द की जांच करना चाहते हैं? –

+0

उम। मेरे मामले में, एक सबस्ट्रिंग। –

उत्तर

13

इनपुट फ़ाइल छोड़ने के लिए अपरिवर्तित अगर needle किसी भी लाइन पर है या फ़ाइल के अंत में सुई संलग्न करने के लिए अगर यह याद आ रही है:

with open("filename", "r+") as file: 
    for line in file: 
     if needle in line: 
      break 
    else: # not found, we are at the eof 
     file.write(needle) # append missing data 

मैं इसे परीक्षण किया है और उस पर Python 2 (stdio आधारित आई/ओ) और अजगर 3 दोनों पर काम करता है (इसे POSIX पढ़ने/लिखने आधारित आई/ओ)।

कोड लूप पायथन सिंटैक्स के बाद अस्पष्ट else का उपयोग करता है। Why does python use 'else' after for and while loops?

+0

क्यों -1? ऐसा लगता है कि क्या चाहता है ... – glglgl

+2

@glglgl: शायद एक डाउनवॉटर "लूप के बाद" अन्यथा "से परिचित नहीं है और उन्होंने सोचा कि मैंने इंडेंटेशन गलत तरीके से उपयोग किया है। – jfs

6

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

f.seek(0, os.SEEK_SET) 

का उपयोग एक फ़ाइल के अंत करने के लिए कूद करने के लिए, का उपयोग

f.seek(0, os.SEEK_END) 

आपके मामले में, अगर एक फाइल कुछ होता है की जाँच करने के, और फिर शायद संलग्न करने के लिए संलग्न फ़ाइल, मैं इस तरह कुछ करना चाहते हैं:

import os 

with open("file.txt", "r+") as f: 
    line_found = any("foo" in line for line in f) 
    if not line_found: 
     f.seek(0, os.SEEK_END) 
     f.write("yay, a new line!\n") 
+0

इस उत्तर के लिए धन्यवाद। मैंने उस फ़ाइल की सामग्री को पुन: व्यवस्थित किया जिसे मैं जांच रहा था और किसी भी तरह से जिस स्ट्रिंग को मैं चेक कर रहा था, वह फ़ाइल में डुप्लीकेट हो रहा था। मुझे आपके मामले में 'line_found' चेक करने से पहले 'f.seek (0, os.SEEK_SET)' का उपयोग करके पहले फ़ाइल की शुरुआत में कूदना पड़ा था, फिर उसे लिखने से पहले फ़ाइल के अंत तक कूदें। –

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