फ़ाइल सामग्री के भीतर स्ट्रिंग बदलें


97

मैं एक फ़ाइल कैसे खोल सकता हूं, Stud.txt, और फिर "A" की किसी भी घटना को "Orange" से बदल सकता हूं?


4
कृपया (हमेशा की तरह) सामान्य प्रश्न दिशानिर्देशों का पालन करें , किसी विशेष प्रतिबंध को बताएं, जो आपने अब तक की कोशिश की है, उसे दिखाएं और इस बारे में पूछें कि क्या विशेष रूप से आपको भ्रमित कर रहा है।

18
कृपया, अपने होमवर्क को [होमवर्क] टैग के साथ चिह्नित करें।
एस.लॉट नोव

जवाबों:


181
with open("Stud.txt", "rt") as fin:
    with open("out.txt", "wt") as fout:
        for line in fin:
            fout.write(line.replace('A', 'Orange'))

8
टेक्स्ट मोड के लिए "t" केवल पायथन 3 है। इसके अलावा, आप अपनी ouput फ़ाइल के लिए एक संदर्भ प्रबंधक प्रदान करते हैं, लेकिन अपनी इनपुट फ़ाइल को बंद करने में विफल होते हैं, जो असंगत लगता है।
स्टीवन रूंबल्स्की 21

1
@katrielalex: कोई डाउनवोट्स नहीं हैं, मैंने बस अपवोट नहीं किया है। लेकिन होमवर्क के जवाब देना ऐसा करने का सही तरीका नहीं है
BlueRaja - Danny Pflughoeft

उह, "होमवर्क" के साथ यह टैग नहीं किया गया था। मैं अपना उत्तर नहीं हटाऊंगा, लेकिन भविष्य में अधिक सावधान रहूंगा
गैरेथ डेविडसन

21
"होमवर्क की समस्याओं के जवाब देना" एक अत्यंत मूर्खतापूर्ण टिप्पणी है। अगर कोई मदद चाहता है तो उनकी मदद करें। हर कोई अपने HW को करना नहीं चाह रहा है, कुछ वास्तव में कुछ सीखना चाहते हैं ...
KingMak

5
मैं होमवर्क के लिए इस की जरूरत थी और यह मेरे बेहद बाहर की मदद की
mikeybeck

78

यदि आप तार को उसी फ़ाइल में बदलना चाहते हैं, तो आपको संभवतः इसकी सामग्री को स्थानीय चर में पढ़ना होगा, इसे बंद करना होगा और इसे फिर से लिखना होगा:

मैं इस उदाहरण में बयान के साथ उपयोग कर रहा हूं , जो withब्लॉक समाप्त होने के बाद फाइल को बंद कर देता है - या तो सामान्य रूप से जब अंतिम कमांड निष्पादित करता है, या एक अपवाद द्वारा।

def inplace_change(filename, old_string, new_string):
    # Safely read the input filename using 'with'
    with open(filename) as f:
        s = f.read()
        if old_string not in s:
            print('"{old_string}" not found in {filename}.'.format(**locals()))
            return

    # Safely write the changed content, if found in the file
    with open(filename, 'w') as f:
        print('Changing "{old_string}" to "{new_string}" in {filename}'.format(**locals()))
        s = s.replace(old_string, new_string)
        f.write(s)

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


यह समाधान बेहतर है क्योंकि आप उपरोक्त उत्तर के विपरीत फ़ाइल का नाम नहीं बदलते हैं।


11

कुछ इस तरह

file = open('Stud.txt')
contents = file.read()
replaced_contents = contents.replace('A', 'Orange')

<do stuff with the result>

ओपी ने "किसी भी घटना" का उल्लेख किया, इसका मतलब यह है, जब यह एक विकल्प है - जो आपके उदाहरण के लिए काम नहीं करेगा।
दुरदु

7
with open('Stud.txt','r') as f:
    newlines = []
    for line in f.readlines():
        newlines.append(line.replace('A', 'Orange'))
with open('Stud.txt', 'w') as f:
    for line in newlines:
        f.write(line)

6

यदि आप लिनक्स पर कर रहे हैं और सिर्फ शब्द बदलना चाहते हैं dogके साथ catआप कर सकते हैं:

text.txt:

Hi, i am a dog and dog's are awesome, i love dogs! dog dog dogs!

लिनक्स कमांड:

sed -i 's/dog/cat/g' test.txt

आउटपुट:

Hi, i am a cat and cat's are awesome, i love cats! cat cat cats!

मूल पोस्ट: /ubuntu/20414/find-and-replace-text-within-a-file-use-commands


2

Pathlib ( https://docs.python.org/3/library/pathlib.html ) का उपयोग करना

from pathlib import Path
file = Path('Stud.txt')
file.write_text(file.read_text().replace('A', 'Orange'))

यदि इनपुट और आउटपुट फाइलें अलग-अलग थीं, तो आप दो अलग-अलग चर का उपयोग करेंगे read_textऔर write_text

यदि आप एक एकल प्रतिस्थापन की तुलना में अधिक जटिल परिवर्तन चाहते थे, तो आप read_textएक चर के परिणाम को असाइन करेंगे , इसे संसाधित करेंगे और नई सामग्री को दूसरे चर में सहेजेंगे, और फिर नई सामग्री को सहेजेंगे write_text

यदि आपकी फ़ाइल बड़ी थी, तो आप एक ऐसा तरीका पसंद करेंगे, जो पूरी फ़ाइल को मेमोरी में न पढ़े, बल्कि इसे अन्य पंक्ति में गारेथ डेविडसन द्वारा शो के रूप में लाइन द्वारा प्रोसेस करें ( https://stackoverflow.com/a/4128192/3981273 ) , जो निश्चित रूप से इनपुट और आउटपुट के लिए दो अलग-अलग फ़ाइलों का उपयोग करने की आवश्यकता है।


मेरे लिए काम नहीं कर रहा है। यह फाइल को अपडेट नहीं कर रहा है
अनुराग

0

सबसे आसान तरीका यह है कि आप इसे नियमित अभिव्यक्तियों के साथ करें, यह मानते हुए कि आप फ़ाइल में प्रत्येक पंक्ति पर पुनरावृति करना चाहते हैं (जहां 'ए' संग्रहीत किया जाएगा) आप करते हैं ...

import re

input = file('C:\full_path\Stud.txt), 'r')
#when you try and write to a file with write permissions, it clears the file and writes only #what you tell it to the file.  So we have to save the file first.

saved_input
for eachLine in input:
    saved_input.append(eachLine)

#now we change entries with 'A' to 'Orange'
for i in range(0, len(old):
    search = re.sub('A', 'Orange', saved_input[i])
    if search is not None:
        saved_input[i] = search
#now we open the file in write mode (clearing it) and writing saved_input back to it
input = file('C:\full_path\Stud.txt), 'w')
for each in saved_input:
    input.write(each)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.