Thay thế chuỗi trong nội dung tệp


97

Làm cách nào để mở một tệp, Stud.txt và sau đó thay thế bất kỳ lần xuất hiện nào của "A" bằng "Orange"?


4
Vui lòng (như mọi khi) tuân theo các nguyên tắc chung về câu hỏi , nêu bất kỳ hạn chế đặc biệt nào, hiển thị những gì bạn đã cố gắng cho đến nay và hỏi về những gì cụ thể đang làm bạn bối rối.

18
Ngoài ra, hãy đánh dấu bài tập về nhà của bạn bằng thẻ [bài tập về nhà].
S.Lott

Câu trả lời:


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" cho chế độ văn bản chỉ là Python 3. Ngoài ra, bạn cung cấp trình quản lý ngữ cảnh cho tệp tải lên của mình, nhưng không đóng được tệp đầu vào của bạn, điều này có vẻ không nhất quán.
Steven Rumbalski

1
@katrielalex: Không có phiếu phản đối nào, tôi chỉ đơn giản là không ủng hộ. Nhưng đưa ra câu trả lời cho bài tập về nhà là không đúng cách để làm điều này
BlueRaja - Danny Pflughoeft

Uh, không nhận thấy điều này được gắn thẻ "bài tập về nhà". Tôi sẽ không xóa câu trả lời của tôi, nhưng sẽ phải cẩn thận hơn trong tương lai
Gareth Davidson

21
"đưa ra câu trả lời cho các bài toán về nhà" là một nhận xét cực kỳ ngu ngốc. Nếu ai đó muốn giúp đỡ thì hãy giúp họ. Không phải ai cũng tìm cách để làm HW của họ, một số thực sự muốn học một cái gì đó ...
KingMak

5
Tôi cần điều này cho bài tập về nhà và nó đã giúp tôi ra vô cùng
mikeybeck

78

Nếu bạn muốn thay thế các chuỗi trong cùng một tệp, bạn có thể phải đọc nội dung của nó thành một biến cục bộ, đóng nó và mở lại để viết:

Tôi đang sử dụng câu lệnh with trong ví dụ này, câu lệnh này sẽ đóng tệp sau khi withkhối kết thúc - thông thường khi lệnh cuối cùng kết thúc thực thi hoặc bằng một ngoại lệ.

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)

Điều đáng nói là nếu các tên tệp khác nhau, chúng ta có thể thực hiện điều này một cách thanh lịch hơn với một withcâu lệnh duy nhất .


Giải pháp này tốt hơn vì bạn không đổi tên tệp không giống như trong câu trả lời ở trên.

47
#!/usr/bin/python

with open(FileName) as f:
    newText=f.read().replace('A', 'Orange')

with open(FileName, "w") as f:
    f.write(newText)

1
Câu trả lời ngắn gọn và súc tích, hay nhất IMO
Briford Wylie 10/02/19

11

Cái gì đó như

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

<do stuff with the result>

OP có nghĩa là "bất kỳ lần xuất hiện nào", điều này có nghĩa là, ngay cả khi nó là một chuỗi con - sẽ không hoạt động cho ví dụ của bạn.
Durdu

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)


2

Sử dụng 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'))

Nếu các tệp đầu vào và đầu ra khác nhau, bạn sẽ sử dụng hai biến khác nhau cho read_textwrite_text.

Nếu bạn muốn một thay đổi phức tạp hơn một thay thế đơn lẻ, bạn sẽ gán kết quả của read_textcho một biến, xử lý nó và lưu nội dung mới vào một biến khác, sau đó lưu nội dung mới với write_text.

Nếu tệp của bạn lớn, bạn sẽ thích một cách tiếp cận không đọc toàn bộ tệp trong bộ nhớ, mà xử lý từng dòng một như hiển thị của Gareth Davidson trong một câu trả lời khác ( https://stackoverflow.com/a/4128192/3981273 ) , tất nhiên yêu cầu sử dụng hai tệp riêng biệt cho đầu vào và đầu ra.


write_text không hoạt động đối với tôi. Nó không cập nhật tệp
Anurag

0

cách dễ nhất là làm điều đó với các biểu thức chính quy, giả sử rằng bạn muốn lặp lại từng dòng trong tệp (nơi 'A' sẽ được lưu trữ) bạn thực hiện ...

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.