दिलचस्प पोस्ट
कर्ल का उपयोग कर HTTPS साइट से कनेक्ट नहीं हो सकता। इसके बजाय 0 लंबाई सामग्री लौटाता है। मैं क्या कर सकता हूँ? मैं जावास्क्रिप्ट के जरिए एक क्रॉस-डोमेन POST अनुरोध कैसे भेजूं? एसक्यूएल परिणाम (या तो माइस्किल या पर्ल अंत पर) में रिक्त तिथियों के पैड का सबसे सीधा तरीका क्या है? नया एप्लिकेशन बनाते समय उपयोग करने के लिए रेल संस्करण निर्दिष्ट करना सरणी लिस्ट <स्ट्रिंग> स्ट्रिंग सरणी को कनवर्ट करें एंड्रॉइड: प्रोग्राम हार्डवेयर से पता चलता है कि डिवाइस हार्डवेयर मेनू बटन है या नहीं जांचें कि क्या एप्लिकेशन पहली बार चल रहा है Java.Util.Scanner के साथ NoSuchElementException "निष्पादन के आसपास" मुहावरे क्या है? जावा में कीवर्ड "यह" का प्रयोग करना फीचर शाखा रिबेस के बाद गिट धक्का खारिज कर दिया गया सर्वलेट के प्रत्येक उदाहरण और सर्वोलेट में सर्वलेट का प्रत्येक धागा के बीच अंतर? कई ग्राहक एक बंदरगाह पर एक साथ कनेक्ट करते हैं, 80 पर कहते हैं, सर्वर पर? पुनरावर्ती कोड रिटर्न कोई नहीं एक NumPy बहुआयामी सरणी के ith कॉलम तक कैसे पहुंचें?

पायथन में फ़ाइल में एक पंक्ति की खोज करें और उसे बदलें

मैं एक पाठ फ़ाइल की सामग्री पर लूप करना चाहता हूं और खोज करता हूं और कुछ पंक्तियों पर प्रतिस्थापित करता हूं और परिणाम को फ़ाइल में वापस लिखता हूं। मैं पहली बार पूरी फाइल मेमोरी में लोड कर सकता हूं और फिर इसे वापस लिख सकता हूं, लेकिन शायद यह करने का सबसे अच्छा तरीका नहीं है।

निम्न कोड के भीतर ऐसा करने का सबसे अच्छा तरीका क्या है?

f = open(file) for line in f: if line.contains('foo'): newline = line.replace('foo', 'bar') # how to write this newline back to the file 

वेब के समाधान से एकत्रित समाधान "पायथन में फ़ाइल में एक पंक्ति की खोज करें और उसे बदलें"

मुझे लगता है कि ऐसा कुछ करना चाहिए। यह मूल रूप से सामग्री को एक नई फ़ाइल में लिखता है और नई फ़ाइल के साथ पुरानी फाइल को बदल देता है:

 from tempfile import mkstemp from shutil import move from os import fdopen, remove def replace(file_path, pattern, subst): #Create temp file fh, abs_path = mkstemp() with fdopen(fh,'w') as new_file: with open(file_path) as old_file: for line in old_file: new_file.write(line.replace(pattern, subst)) #Remove original file remove(file_path) #Move new file move(abs_path, file_path) 

सबसे छोटा रास्ता शायद फाइलिनपुट मॉड्यूल का उपयोग करने के लिए होगा। उदाहरण के लिए, निम्नलिखित फाइल में लाइन नंबर जोड़ते हैं, इन-प्लेस:

 import fileinput for line in fileinput.input("test.txt", inplace=True): print "%d: %s" % (fileinput.filelineno(), line), 

यहाँ क्या होता है:

  1. मूल फ़ाइल को बैकअप फ़ाइल में ले जाया गया है
  2. मानक आउटपुट को लूप के भीतर मूल फ़ाइल में रीडायरेक्ट किया जाता है
  3. इस प्रकार कोई भी print स्टेटमेंट मूल फ़ाइल में वापस लिखते हैं

fileinput में अधिक घंटी और सीटी हैं उदाहरण के लिए, यह sys.args[1:] में सभी फाइलों पर स्वचालित रूप से संचालित करने के लिए इस्तेमाल किया जा सकता है, बिना उन्हें स्पष्ट रूप से पुनरावृत्त किए बिना पायथन 3.2 के साथ शुरू करने से यह एक with बयान में उपयोग के लिए सुविधाजनक संदर्भ प्रबंधक भी प्रदान करता है।


जबकि fileinput थकाऊ लिपियों के लिए बहुत अच्छा है, मैं इसे असली कोड में उपयोग करने से सावधान रहना होगा क्योंकि यह fileinput है कि यह बहुत पठनीय या परिचित नहीं है। वास्तविक (उत्पादन) कोड में यह प्रक्रिया को स्पष्ट करने के लिए कोड की कुछ और पंक्तियां खर्च करने के लिए उपयुक्त है और इस प्रकार कोड को पठनीय बना देता है।

दो विकल्प हैं:

  1. फ़ाइल बहुत अधिक बड़ी नहीं है, और आप इसे पूरी तरह मेमोरी तक पढ़ सकते हैं। फिर फ़ाइल को बंद करें, इसे लिखित मोड में दोबारा खोलें और संशोधित सामग्री वापस लिखें।
  2. फ़ाइल मेमोरी में संग्रहीत करने के लिए बहुत बड़ी है; आप इसे किसी अस्थायी फ़ाइल पर ले जा सकते हैं और इसे खोल सकते हैं, इसे लाइन द्वारा लाइन पढ़कर, मूल फ़ाइल में वापस लिखे। ध्यान दें कि इसके भंडारण के लिए दो बार आवश्यकता है।

यहां एक और उदाहरण दिया गया है जिसे परीक्षण किया गया था, और खोज और प्रतिमानों को प्रतिस्थापित कर दिया जाएगा:

 import fileinput import sys def replaceAll(file,searchExp,replaceExp): for line in fileinput.input(file, inplace=1): if searchExp in line: line = line.replace(searchExp,replaceExp) sys.stdout.write(line) 

उदाहरण उपयोग:

 replaceAll("/fooBar.txt","Hello\sWorld!$","Goodbye\sWorld.") 

यह काम करना चाहिए: (इन-प्लेटिंग संपादन)

 import fileinput # Does a list of files, and # redirects STDOUT to the file in question for line in fileinput.input(files, inplace = 1): print line.replace("foo", "bar"), 

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

यह कार्यान्वयन फ़ाइल सामग्री को अस्थायी फ़ाइलों का उपयोग किए बिना बदल देता है, क्योंकि परिणामस्वरूप फ़ाइल अनुमतियां अपरिवर्तित रहती हैं।

प्रतिस्थापित करने के बजाय इसके re.sub, केवल सादे पाठ प्रतिस्थापन के बजाय regex प्रतिस्थापन की अनुमति देता है।

पंक्ति को लाइन के बजाय फ़ाइल को एक स्ट्रिंग के रूप में पढ़ना मल्टीलाइन मिलान और प्रतिस्थापन के लिए अनुमति देता है।

 import re def replace(file, pattern, subst): # Read contents from file as a single string file_handle = open(file, 'r') file_string = file_handle.read() file_handle.close() # Use RE package to allow for replacement (also allowing for (multiline) REGEX) file_string = (re.sub(pattern, subst, file_string)) # Write contents to file. # Using mode 'w' truncates the file. file_handle = open(file, 'w') file_handle.write(file_string) file_handle.close() 

जैसा कि lassevk सुझाव देता है, जैसा कि आप जाना है, नई फ़ाइल लिखें, यहाँ कुछ उदाहरण कोड है:

 fin = open("a.txt") fout = open("b.txt", "wt") for line in fin: fout.write( line.replace('foo', 'bar') ) fin.close() fout.close() 

यदि आप किसी सामान्य टेक्स्ट को किसी अन्य टेक्स्ट के साथ बदलते हैं, तो यह जाने का सबसे अच्छा तरीका हो सकता है, खासकर यदि आप regex के प्रशंसक हैं:

 import re def replace( filePath, text, subs, flags=0 ): with open( filePath, "r+" ) as file: fileContents = file.read() textPattern = re.compile( re.escape( text ), flags ) fileContents = textPattern.sub( subs, fileContents ) file.seek( 0 ) file.truncate() file.write( fileContents ) 

एक और अजगर तरीका नीचे दिए गए कोड की तरह संदर्भ प्रबंधक का उपयोग करना होगा:

 from tempfile import mkstemp from shutil import move from os import remove def replace(source_file_path, pattern, substring): fh, target_file_path = mkstemp() with open(target_file_path, 'w') as target_file: with open(source_file_path, 'r') as source_file: for line in source_file: target_file.write(line.replace(pattern, substring)) remove(source_file_path) move(target_file_path, source_file_path) 

आप यहां पूर्ण स्निपेट पा सकते हैं।

एक नई फ़ाइल बनाएं, पुराने से नए की प्रतिलिपि बनाएं, और नई फ़ाइल में लाइन लिखने से पहले प्रतिस्थापित करें।

@ किरण के जवाब पर विस्तार, जो मैं सहमत हूं, अधिक संक्षिप्त और पायथनिक है, यह यूटीएफ -8 के पढ़ने और लिखने के समर्थन में कोडेक्स जोड़ता है:

 import codecs from tempfile import mkstemp from shutil import move from os import remove def replace(source_file_path, pattern, substring): fh, target_file_path = mkstemp() with codecs.open(target_file_path, 'w', 'utf-8') as target_file: with codecs.open(source_file_path, 'r', 'utf-8') as source_file: for line in source_file: target_file.write(line.replace(pattern, substring)) remove(source_file_path) move(target_file_path, source_file_path) 

यदि आप नीचे की तरह इंडेंट को निकालते हैं, तो वह एकाधिक पंक्ति में खोज और प्रतिस्थापित करेगी। उदाहरण के लिए नीचे देखें

 def replace(file, pattern, subst): #Create temp file fh, abs_path = mkstemp() print fh, abs_path new_file = open(abs_path,'w') old_file = open(file) for line in old_file: new_file.write(line.replace(pattern, subst)) #close temp file new_file.close() close(fh) old_file.close() #Remove original file remove(file) #Move new file move(abs_path, file) 

टेम्पलेट के रूप में हैमिशमसीएन के उत्तर का उपयोग करना मैं एक फ़ाइल में एक रेखा के लिए खोज कर रहा था जो मेरे रीगेक्स से मेल खाता है और इसे रिक्त स्ट्रिंग के साथ बदलता है।

 import re fin = open("in.txt", 'r') # in file fout = open("out.txt", 'w') # out file for line in fin: p = re.compile('[-][0-9]*[.][0-9]*[,]|[-][0-9]*[,]') # pattern newline = p.sub('',line) # replace matching strings with empty string print newline fout.write(newline) fin.close() fout.close()