แทนที่สตริงภายในเนื้อหาไฟล์


100

ฉันจะเปิดไฟล์ Stud.txt แล้วแทนที่การเกิด "A" ด้วย "Orange" ได้อย่างไร


4
โปรด (เช่นเคย) ปฏิบัติตามหลักเกณฑ์ทั่วไปของคำถามระบุข้อ จำกัด พิเศษแสดงสิ่งที่คุณได้ลองทำจนถึงตอนนี้และถามเกี่ยวกับสิ่งที่ทำให้คุณสับสนโดยเฉพาะ

21
กรุณาทำเครื่องหมายการบ้านของคุณด้วยแท็ก [การบ้าน]
ล็อต

คำตอบ:


183
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" สำหรับโหมดข้อความคือ Python 3 เท่านั้น นอกจากนี้คุณยังมีตัวจัดการบริบทสำหรับไฟล์ ouput ของคุณ แต่ไม่สามารถปิดไฟล์อินพุตของคุณซึ่งดูเหมือนจะไม่สอดคล้องกัน
Steven Rumbalski

1
@katrielalex: ไม่มี downvotes ฉันไม่ได้โหวตเพิ่ม แต่การให้คำตอบการบ้านไม่ใช่วิธีที่ถูกต้อง
BlueRaja - Danny Pflughoeft

เอ่อไม่ได้สังเกตว่ามีแท็ก "การบ้าน" ฉันจะไม่ลบคำตอบ แต่จะระมัดระวังให้มากขึ้นในอนาคต
Gareth Davidson

23
"การให้คำตอบสำหรับปัญหาการบ้าน" เป็นความคิดเห็นที่โง่มาก หากมีใครต้องการความช่วยเหลือก็ช่วยพวกเขา ไม่ใช่ทุกคนที่ต้องการทำ HW ของพวกเขาบางคนต้องการเรียนรู้บางอย่างจริงๆ ...
KingMak

6
ฉันต้องการสิ่งนี้สำหรับการบ้านและมันช่วยฉันได้อย่างมาก
mikeybeck

81

หากคุณต้องการแทนที่สตริงในไฟล์เดียวกันคุณอาจต้องอ่านเนื้อหาในตัวแปรโลคัลปิดและเปิดใหม่เพื่อเขียน:

ฉันใช้คำสั่ง withในตัวอย่างนี้ซึ่งจะปิดไฟล์หลังจากที่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คำสั่งเดียว


1
วิธีนี้ดีกว่าเพราะคุณไม่ได้เปลี่ยนชื่อไฟล์ต่างจากคำตอบข้างบน


11

สิ่งที่ต้องการ

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

<do stuff with the result>

OP menioned "any occurences" ซึ่งหมายความว่าแม้ว่าจะเป็นสตริงย่อย - ซึ่งจะใช้ไม่ได้กับตัวอย่างของคุณ
Durdu


6

หากคุณใช้ linux และต้องการแทนที่คำdogด้วยcatคุณสามารถทำได้:

text.txt:

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

คำสั่ง Linux:

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-using-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ตัวแปรที่จะประมวลผลและบันทึกเนื้อหาใหม่ให้กับตัวแปรอื่นแล้วบันทึกเนื้อหาใหม่ด้วย

หากไฟล์ของคุณมีขนาดใหญ่คุณต้องการวิธีการที่ไม่อ่านไฟล์ทั้งหมดในหน่วยความจำ แต่ให้ประมวลผลทีละบรรทัดตามที่ Gareth Davidson แสดงในคำตอบอื่น ( https://stackoverflow.com/a/4128192/3981273 ) ซึ่งแน่นอนว่าต้องใช้ไฟล์สองไฟล์ที่แตกต่างกันสำหรับอินพุตและเอาต์พุต


write_text ไม่ทำงานสำหรับฉัน มันไม่ได้อัปเดตไฟล์
Anurag

0

วิธีที่ง่ายที่สุดคือทำด้วยนิพจน์ทั่วไปสมมติว่าคุณต้องการวนซ้ำในแต่ละบรรทัดในไฟล์ (โดยที่ 'A' จะถูกเก็บไว้) คุณทำ ...

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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.