Hướng dẫn python replace line in file - python thay thế dòng trong tệp

Tôi muốn lặp lại nội dung của tệp văn bản và thực hiện tìm kiếm và thay thế trên một số dòng và viết kết quả trở lại tệp. Trước tiên tôi có thể tải toàn bộ tệp trong bộ nhớ và sau đó viết lại, nhưng đó có lẽ không phải là cách tốt nhất để làm điều đó.

Cách tốt nhất để làm điều này, trong mã sau là gì?

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

Hướng dẫn python replace line in file - python thay thế dòng trong tệp

Silentghost

294K64 Huy hiệu vàng301 Huy hiệu bạc291 Huy hiệu Đồng64 gold badges301 silver badges291 bronze badges

hỏi ngày 2 tháng 9 năm 2008 lúc 9:19Sep 2, 2008 at 9:19

0

Cách ngắn nhất có thể là sử dụng mô -đun FileInput. Ví dụ: sau đây thêm số dòng vào một tệp, tại chỗ:

import fileinput

for line in fileinput.input("test.txt", inplace=True):
    print('{} {}'.format(fileinput.filelineno(), line), end='') # for Python 3
    # print "%d: %s" % (fileinput.filelineno(), line), # for Python 2

Điều gì xảy ra ở đây là:

  1. Tệp gốc được chuyển sang tệp sao lưu
  2. Đầu ra tiêu chuẩn được chuyển hướng đến tệp gốc trong vòng lặp
  3. Do đó, bất kỳ câu lệnh
    import fileinput
    
    for line in fileinput.input("test.txt", inplace=True):
        print('{} {}'.format(fileinput.filelineno(), line), end='') # for Python 3
        # print "%d: %s" % (fileinput.filelineno(), line), # for Python 2
    
    5 nào ghi lại vào tệp gốc

import fileinput

for line in fileinput.input("test.txt", inplace=True):
    print('{} {}'.format(fileinput.filelineno(), line), end='') # for Python 3
    # print "%d: %s" % (fileinput.filelineno(), line), # for Python 2
6 có nhiều chuông và còi hơn. Ví dụ: nó có thể được sử dụng để tự động hoạt động trên tất cả các tệp trong
import fileinput

for line in fileinput.input("test.txt", inplace=True):
    print('{} {}'.format(fileinput.filelineno(), line), end='') # for Python 3
    # print "%d: %s" % (fileinput.filelineno(), line), # for Python 2
7 mà không cần phải lặp lại chúng một cách rõ ràng. Bắt đầu với Python 3.2, nó cũng cung cấp Trình quản lý bối cảnh thuận tiện để sử dụng trong câu lệnh
import fileinput

for line in fileinput.input("test.txt", inplace=True):
    print('{} {}'.format(fileinput.filelineno(), line), end='') # for Python 3
    # print "%d: %s" % (fileinput.filelineno(), line), # for Python 2
8.


Mặc dù

import fileinput

for line in fileinput.input("test.txt", inplace=True):
    print('{} {}'.format(fileinput.filelineno(), line), end='') # for Python 3
    # print "%d: %s" % (fileinput.filelineno(), line), # for Python 2
6 là tuyệt vời cho các kịch bản vứt bỏ, tôi sẽ cảnh giác khi sử dụng nó trong mã thực bởi vì phải thừa nhận rằng nó không dễ đọc hoặc quen thuộc. Trong mã thực (sản xuất), thật đáng để chi tiêu thêm một vài dòng mã để làm cho quy trình rõ ràng và do đó làm cho mã có thể đọc được.

Có hai tùy chọn:

  1. Tệp không quá lớn và bạn chỉ có thể đọc nó hoàn toàn vào bộ nhớ. Sau đó đóng tệp, mở lại nó ở chế độ viết và viết lại nội dung đã sửa đổi.
  2. Tệp quá lớn để được lưu trữ trong bộ nhớ; Bạn có thể chuyển nó sang một tệp tạm thời và mở nó, đọc từng dòng, ghi lại vào tệp gốc. Lưu ý rằng điều này đòi hỏi hai lần lưu trữ.

Alex Altair

2.8863 huy hiệu vàng20 Huy hiệu bạc37 Huy hiệu đồng3 gold badges20 silver badges37 bronze badges

Đã trả lời ngày 14 tháng 11 năm 2008 lúc 15:47Nov 14, 2008 at 15:47

Eli Benderskyeli BenderskyEli Bendersky

253K87 Huy hiệu vàng344 Huy hiệu bạc406 Huy hiệu đồng87 gold badges344 silver badges406 bronze badges

15

Tôi đoán một cái gì đó như thế này nên làm điều đó. Về cơ bản, nó ghi nội dung vào một tệp mới và thay thế tệp cũ bằng tệp mới:

from tempfile import mkstemp
from shutil import move, copymode
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))
    #Copy the file permissions from the old file to the new file
    copymode(file_path, abs_path)
    #Remove original file
    remove(file_path)
    #Move new file
    move(abs_path, file_path)

Đã trả lời ngày 2 tháng 9 năm 2008 lúc 9:42Sep 2, 2008 at 9:42

Thomas Watnedalthomas WatnedalThomas Watnedal

4.7934 Huy hiệu vàng23 Huy hiệu bạc23 Huy hiệu Đồng4 gold badges23 silver badges23 bronze badges

9

Đây là một ví dụ khác đã được kiểm tra và sẽ phù hợp với các mẫu tìm kiếm và thay thế:

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)

Ví dụ sử dụng:

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

người đàn ông thiếc

156K41 Huy hiệu vàng209 Huy hiệu bạc297 Huy hiệu Đồng41 gold badges209 silver badges297 bronze badges

Đã trả lời ngày 24 tháng 11 năm 2008 lúc 19:02Nov 24, 2008 at 19:02

JasonjasonJason

2.65127 Huy hiệu bạc28 Huy hiệu đồng27 silver badges28 bronze badges

4

Điều này sẽ hoạt động: (Chỉnh sửa tại chỗ)

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"),

Gringo Suave

28.4K6 Huy hiệu vàng84 Huy hiệu bạc74 Huy hiệu đồng6 gold badges84 silver badges74 bronze badges

Đã trả lời ngày 7 tháng 9 năm 2009 lúc 10:07Sep 7, 2009 at 10:07

KinlankinlanKinlan

16.1K5 Huy hiệu vàng55 Huy hiệu bạc87 Huy hiệu đồng5 gold badges55 silver badges87 bronze badges

4

Dựa trên câu trả lời của Thomas Watnedal. Tuy nhiên, điều này không trả lời chính xác phần trực tiếp của câu hỏi ban đầu. Chức năng vẫn có thể thay thế trên cơ sở trực tiếp

Việc triển khai này thay thế các nội dung tệp mà không cần sử dụng các tệp tạm thời, do đó, các quyền của tệp vẫn không thay đổi.

Ngoài ra RE.Sub thay vì thay thế, cho phép thay thế Regex thay vì chỉ thay thế văn bản đơn giản.

Đọc tệp dưới dạng một chuỗi thay vì từng dòng cho phép kết hợp và thay thế đa dòng.

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()

Đã trả lời ngày 30 tháng 11 năm 2012 lúc 8:51Nov 30, 2012 at 8:51

ThijsthijsThijs

2593 Huy hiệu bạc4 Huy hiệu đồng3 silver badges4 bronze badges

2

Như Lassevk gợi ý, hãy viết ra tệp mới khi bạn đi, đây là một số mã ví dụ:

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

Đã trả lời ngày 2 tháng 9 năm 2008 lúc 9:42Sep 2, 2008 at 9:42

Thomas Watnedalthomas Watnedalhamishmcn

4.7934 Huy hiệu vàng23 Huy hiệu bạc23 Huy hiệu Đồng10 gold badges40 silver badges46 bronze badges

Đây là một ví dụ khác đã được kiểm tra và sẽ phù hợp với các mẫu tìm kiếm và thay thế:

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 )

Ví dụ sử dụng:Feb 18, 2014 at 14:43

0

người đàn ông thiếc

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)

156K41 Huy hiệu vàng209 Huy hiệu bạc297 Huy hiệu Đồng

Hướng dẫn python replace line in file - python thay thế dòng trong tệp

Đã trả lời ngày 24 tháng 11 năm 2008 lúc 19:02

Jasonjason3 gold badges12 silver badges26 bronze badges

2.65127 Huy hiệu bạc28 Huy hiệu đồngSep 7, 2013 at 18:39

Hướng dẫn python replace line in file - python thay thế dòng trong tệp

Điều này sẽ hoạt động: (Chỉnh sửa tại chỗ)Kiran

Gringo Suave1 gold badge11 silver badges24 bronze badges

1

28.4K6 Huy hiệu vàng84 Huy hiệu bạc74 Huy hiệu đồng

import fileinput

for line in fileinput.input("test.txt", inplace=True):
    print('{} {}'.format(fileinput.filelineno(), line), end='') # for Python 3
    # print "%d: %s" % (fileinput.filelineno(), line), # for Python 2
0

Explanation:

  • Đã trả lời ngày 7 tháng 9 năm 2009 lúc 10:07
  • Kinlankinlan
  • 16.1K5 Huy hiệu vàng55 Huy hiệu bạc87 Huy hiệu đồng

Dựa trên câu trả lời của Thomas Watnedal. Tuy nhiên, điều này không trả lời chính xác phần trực tiếp của câu hỏi ban đầu. Chức năng vẫn có thể thay thế trên cơ sở trực tiếp

import fileinput

for line in fileinput.input("test.txt", inplace=True):
    print('{} {}'.format(fileinput.filelineno(), line), end='') # for Python 3
    # print "%d: %s" % (fileinput.filelineno(), line), # for Python 2
1

Việc triển khai này thay thế các nội dung tệp mà không cần sử dụng các tệp tạm thời, do đó, các quyền của tệp vẫn không thay đổi.Oct 3, 2019 at 10:37

Hướng dẫn python replace line in file - python thay thế dòng trong tệp

Ngoài ra RE.Sub thay vì thay thế, cho phép thay thế Regex thay vì chỉ thay thế văn bản đơn giản.Akif

Đọc tệp dưới dạng một chuỗi thay vì từng dòng cho phép kết hợp và thay thế đa dòng.2 gold badges39 silver badges41 bronze badges

1

Đã trả lời ngày 30 tháng 11 năm 2012 lúc 8:51

Đã trả lời ngày 2 tháng 9 năm 2008 lúc 9:24Sep 2, 2008 at 9:24

Lasse V. Karlsenlasse V. KarlsenLasse V. Karlsen

371K98 Huy hiệu vàng620 Huy hiệu bạc805 Huy hiệu Đồng98 gold badges620 silver badges805 bronze badges

Mở rộng câu trả lời của @Kiran, mà tôi đồng ý là ngắn gọn và Pythonic hơn, điều này bổ sung các codec để hỗ trợ việc đọc và viết của UTF-8:

import fileinput

for line in fileinput.input("test.txt", inplace=True):
    print('{} {}'.format(fileinput.filelineno(), line), end='') # for Python 3
    # print "%d: %s" % (fileinput.filelineno(), line), # for Python 2
2

Đã trả lời ngày 2 tháng 5 năm 2014 lúc 11:15May 2, 2014 at 11:15

IgniteFlowigniteFlowigniteflow

8.04610 Huy hiệu vàng37 Huy hiệu bạc46 Huy hiệu đồng10 gold badges37 silver badges46 bronze badges

1

Sử dụng câu trả lời của Hamishmcn làm mẫu, tôi có thể tìm kiếm một dòng trong một tệp phù hợp với regex của tôi và thay thế nó bằng chuỗi trống.

import fileinput

for line in fileinput.input("test.txt", inplace=True):
    print('{} {}'.format(fileinput.filelineno(), line), end='') # for Python 3
    # print "%d: %s" % (fileinput.filelineno(), line), # for Python 2
3

Đã trả lời ngày 17 tháng 4 năm 2014 lúc 2:13Apr 17, 2014 at 2:13

EmmanuelemmanuelEmmanuel

431 Huy hiệu bạc5 Huy hiệu đồng1 silver badge5 bronze badges

1

Nếu bạn loại bỏ vết lõm ở mức dưới đây, nó sẽ tìm kiếm và thay thế theo nhiều dòng. Xem bên dưới ví dụ.

import fileinput

for line in fileinput.input("test.txt", inplace=True):
    print('{} {}'.format(fileinput.filelineno(), line), end='') # for Python 3
    # print "%d: %s" % (fileinput.filelineno(), line), # for Python 2
4

Đã trả lời ngày 2 tháng 8 năm 2012 lúc 19:12Aug 2, 2012 at 19:12

1

Làm thế nào để bạn thay thế một dòng cụ thể trong một tệp?

Logic để thay thế dòng cụ thể trong một tệp văn bản..
Tệp nguồn mở ở chế độ đọc, lưu trữ tham chiếu của nó đến FPTR ..
Tạo và mở một tệp tạm thời với tên thay thế. ....
Số dòng đầu vào để thay thế trong tệp từ người dùng. ....
Nhập dòng mới từ người dùng để thay thế, lưu trữ nó trong newline ..
Khởi tạo một biến đếm với 0 ..

Làm thế nào để bạn thay thế văn bản trong một tệp trong Python?

Để thay thế một chuỗi trong tệp bằng Python, hãy làm theo các bước sau:..
Mở tệp đầu vào ở chế độ đọc và xử lý nó ở chế độ văn bản ..
Mở tệp đầu ra ở chế độ ghi và xử lý nó ở chế độ văn bản ..
Đối với mỗi dòng đọc từ tệp đầu vào, thay thế chuỗi và ghi vào tệp đầu ra ..
Đóng cả tệp đầu vào và đầu ra ..

Làm thế nào để bạn thay thế một chuỗi trong một dòng trong Python?

Cú pháp thay thế ()..
Cú pháp: String.replace (cũ, mới, đếm).
Parameters:.
Giá trị trả về: Nó trả về một bản sao của chuỗi trong đó tất cả các lần xuất hiện của một chuỗi con được thay thế bằng một chuỗi con khác ..

Làm thế nào để bạn thay thế một từ trong một dòng trong Python?

Phương thức python String thay thế () Phương thức thay thế () thay thế một cụm từ được chỉ định bằng một cụm từ được chỉ định khác.Lưu ý: Tất cả các lần xuất hiện của cụm từ được chỉ định sẽ được thay thế, nếu không có gì khác được chỉ định.The replace() method replaces a specified phrase with another specified phrase. Note: All occurrences of the specified phrase will be replaced, if nothing else is specified.