如何在文件中搜索和替换文本

2024-11-29 08:42:00
admin
原创
116
摘要:问题描述:如何使用 Python 3 在文件中搜索和替换文本?这是我的代码:import os import sys import fileinput print("Text to search for:") textToSearch = input("> ")...

问题描述:

如何使用 Python 3 在文件中搜索和替换文本?

这是我的代码:

import os
import sys
import fileinput

print("Text to search for:")
textToSearch = input("> ")

print("Text to replace it with:")
textToReplace = input("> ")

print("File to perform Search-Replace on:")
fileToSearch = input("> ")

tempFile = open(fileToSearch, 'r+')

for line in fileinput.input(fileToSearch):
    if textToSearch in line:
        print('Match Found')
    else:
        print('Match Not Found!!')
    tempFile.write(line.replace(textToSearch, textToReplace))
tempFile.close()

input('

 Press Enter to exit...')

输入文件:

hi this is abcd hi this is abcd
This is dummy text file.
This is how search and replace works abcd

当我在上面的输入文件中搜索并用“abcd”替换“ram”时,它工作得很好。但是当我反过来做时,即将“abcd”替换为“ram”,最后会留下一些垃圾字符。

将“abcd”替换为“ram”:

hi this is ram hi this is ram
This is dummy text file.
This is how search and replace works rambcd

解决方案 1:

正如michaelb958 所指出的,您不能用不同长度的数据进行替换,因为这会使其余部分错位。我不同意其他发帖人建议您从一个文件读取并写入另一个文件。相反,我会将文件读入内存,修复数据,然后在单独的步骤中将其写入同一文件。

# Read in the file
with open('file.txt', 'r') as file:
  filedata = file.read()

# Replace the target string
filedata = filedata.replace('abcd', 'ram')

# Write the file out again
with open('file.txt', 'w') as file:
  file.write(filedata)

除非您要处理的文件非常大,无法一次性加载到内存中,或者您担心在第二步将数据写入文件时中断该过程可能会导致数据丢失。

解决方案 2:

fileinput已经支持就地编辑。stdout在本例中,它会重定向到文件:

#!/usr/bin/env python3
import fileinput

with fileinput.FileInput(filename, inplace=True, backup='.bak') as file:
    for line in file:
        print(line.replace(text_to_search, replacement_text), end='')

解决方案 3:

正如Jack Aidley 所发布并且jfs 指出的那样,此代码不起作用:

# Read in the file
filedata = None
with file = open('file.txt', 'r') :
  filedata = file.read()

# Replace the target string
filedata.replace('ram', 'abcd')

# Write the file out again
with file = open('file.txt', 'w') :
  file.write(filedata)`

但是这个代码可以工作(我已经测试过了):

f = open(filein,'r')
filedata = f.read()
f.close()

newdata = filedata.replace("old data","new data")

f = open(fileout,'w')
f.write(newdata)
f.close()

使用这种方法,filein 和 fileout 可以是同一个文件,因为 Python 3.3 在打开进行写入时会覆盖该文件。

解决方案 4:

你可以像这样进行替换

f1 = open('file1.txt', 'r')
f2 = open('file2.txt', 'w')
for line in f1:
    f2.write(line.replace('old_text', 'new_text'))
f1.close()
f2.close()

解决方案 5:

您也可以使用pathlib

from pathlib2 import Path
path = Path(file_to_search)
text = path.read_text()
text = text.replace(text_to_search, replacement_text)
path.write_text(text)

解决方案 6:

(pip 安装 python-util)

from pyutil import filereplace

filereplace("somefile.txt","abcd","ram")

将所有出现的“abcd”替换为“ram”。

该函数还支持正则表达式,方法是指定regex=True

from pyutil import filereplace

filereplace("somefile.txt","\\w+","ram",regex=True)

免责声明:我是作者(https://github.com/MisterL2/python-util

解决方案 7:

以读取模式打开文件。以字符串格式读取文件。按预期替换文本。关闭文件。再次以写入模式打开文件。最后,将替换的文本写入同一文件。

try:
    with open("file_name", "r+") as text_file:
        texts = text_file.read()
        texts = texts.replace("to_replace", "replace_string")
    with open(file_name, "w") as text_file:
        text_file.write(texts)
except FileNotFoundError as f:
    print("Could not find the file you are trying to read.")

解决方案 8:

回答晚了,但这是我在文本文件中查找和替换所用的方法:

with open("test.txt") as r:
  text = r.read().replace("THIS", "THAT")
with open("test.txt", "w") as w:
  w.write(text)

演示

解决方案 9:

您的问题源于对同一文件的读取和写入。不是打开fileToSearch进行写入,而是打开一个实际的临时文件,然后在完成并关闭后tempFile,使用os.rename将新文件移到 上fileToSearch

解决方案 10:

使用单个 with 块,您可以搜索和替换文本:

with open('file.txt','r+') as f:
    filedata = f.read()
    filedata = filedata.replace('abc','xyz')
    f.truncate(0)
    f.write(filedata)

解决方案 11:

使用re.subn它可以更好地控制替换过程,例如将单词拆分为两行、区分大小写匹配。此外,如果找不到字符串,它会返回可用于避免资源浪费的匹配数量。

import re

file = # path to file

# they can be also raw string and regex
textToSearch = r'Ha.*O' # here an example with a regex
textToReplace = 'hallo'

# read and replace
with open(file, 'r') as fd:
    # sample case-insensitive find-and-replace
    text, counter = re.subn(textToSearch, textToReplace, fd.read(), re.I)

# check if there is at least a  match
if counter > 0:
    # edit the file
    with open(file, 'w') as fd:
        fd.write(text)

# summary result
print(f'{counter} occurence of "{textToSearch}" were replaced with "{textToReplace}".')

一些正则表达式:

  • 添加re.I标志,缩写形式 re.IGNORECASE,用于不区分大小写的匹配

  • 对于多行替换`re.subn(r'
    *'.join(textToSearch), textToReplace, fd.read()),也取决于数据'

{,1}'。请注意,在这种情况下textToSearch`必须是纯字符串,而不是正则表达式!

解决方案 12:

我的变体是,在整个文件中一次一个单词。

我把它读进记忆里。

def replace_word(infile,old_word,new_word):
    if not os.path.isfile(infile):
        print ("Error on replace_word, not a regular file: "+infile)
        sys.exit(1)

    f1=open(infile,'r').read()
    f2=open(infile,'w')
    m=f1.replace(old_word,new_word)
    f2.write(m)

解决方案 13:

除了已经提到的答案之外,这里解释了为什么最后有一些随机字符:您是在模式

下打开文件,而不是模式下。关键区别在于,模式会在您打开文件时立即清除文件内容,而不会。
这意味着如果您的文件内容是“123456789”,并且您在其中写入“www”,则会得到“www456789”。它会用新输入覆盖字符,但不会改变任何剩余的输入。
您可以使用清除文件内容的一部分,但最好先将更新的文件内容保存为字符串,然后一次性完成并写入所有内容。
或者您可以使用我的库:Dr+`wwr+`

truncate(<startPosition>)`truncate(0)`

解决方案 14:

我遇到了同样的问题。问题是,当你将 .txt 文件加载到变量中时,你会将其用作字符串数组,而它实际上是字符数组。

swapString = []
with open(filepath) as f: 
    s = f.read()
for each in s:
    swapString.append(str(each).replace('this','that'))
s = swapString
print(s)

解决方案 15:

您可以在 Python 中使用sed或AWK或grep(有一些限制)。这是一个非常简单的示例。它将文件中的banana更改为bananatoothpaste。您可以编辑并使用它。(我测试过了,它成功了……注意:如果您在 Windows 下测试,您应该先安装“sed”命令并设置路径)

import os

file = "a.txt"
oldtext = "Banana"
newtext = " BananaToothpaste"
os.system('sed -i "s/{}/{}/g" {}'.format(oldtext, newtext, file))
#print(f'sed -i "s/{oldtext}/{newtext}/g" {file}')
print('This command was applied:  sed -i "s/{}/{}/g" {}'.format(oldtext, newtext, file))

如果要直接查看文件结果,Windows 系统输入“type”,Linux 系统输入“cat”:

#### For Windows:
os.popen("type " + file).read()

#### For Linux:
os.popen("cat " + file).read()

解决方案 16:

我已经这样做了:

#!/usr/bin/env python3

import fileinput
import os

Dir = input ("Source directory: ")
os.chdir(Dir)

Filelist = os.listdir()
print('File list: ',Filelist)

NomeFile = input ("Insert file name: ")

CarOr = input ("Text to search: ")

CarNew = input ("New text: ")

with fileinput.FileInput(NomeFile, inplace=True, backup='.bak') as file:
    for line in file:
        print(line.replace(CarOr, CarNew), end='')

file.close ()

解决方案 17:

我尝试了这个,并使用 readlines 而不是 read

with open('dummy.txt','r') as file:
    list = file.readlines()
print(f'before removal {list}')
for i in list[:]:
        list.remove(i)

print(f'After removal {list}')
with open('dummy.txt','w+') as f:
    for i in list:
        f.write(i)

解决方案 18:

我稍微修改了Jayram 的帖子,以便将每个“!”字符替换为我希望随着每个实例而增加的数字。我认为这对想要修改每行出现多次的字符并想要迭代的人可能会有所帮助。这对我来说很有效。

f1 = open('file1.txt', 'r')
f2 = open('file2.txt', 'w')
n = 1

# if word=='!'replace w/ [n] & increment n; else append same word to
# file2

for line in f1:
    for word in line:
        if word == '!':
            f2.write(word.replace('!', f'[{n}]'))
            n += 1
        else:
            f2.write(word)
f1.close()
f2.close()

解决方案 19:

使用:

def word_replace(filename, old, new):
    c = 0
    with open(filename, 'r+', encoding ='utf-8') as f:
        a = f.read()
        b = a.split()
        for i in range(0, len(b)):
            if b[i] == old:
                c = c + 1
        old = old.center(len(old) + 2)
        new = new.center(len(new) + 2)
        d = a.replace(old, new, c)
        f.truncate(0)
        f.seek(0)
        f.write(d)

    print('All words have been replaced!!!')

解决方案 20:

我已将其作为课程练习:打开文件,查找和替换字符串并写入新文件。

class Letter:

    def __init__(self):

        with open("./Input/Names/invited_names.txt", "r") as file:
            # read the list of names
            list_names = [line.rstrip() for line in file]
            with open("./Input/Letters/starting_letter.docx", "r") as f:
                # read letter
                file_source = f.read()
            for name in list_names:
                with open(f"./Output/ReadyToSend/LetterTo{name}.docx", "w") as f:
                    # replace [name] with name of the list in the file
                    replace_string = file_source.replace('[name]', name)
                    # write to a new file
                    f.write(replace_string)


brief = Letter()

解决方案 21:

就像这样:

def find_and_replace(file, word, replacement):
  with open(file, 'r+') as f:
    text = f.read()
    f.write(text.replace(word, replacement))

解决方案 22:

def findReplace(find, replace):

    import os 

    src = os.path.join(os.getcwd(), os.pardir) 

    for path, dirs, files in os.walk(os.path.abspath(src)):

        for name in files: 

            if name.endswith('.py'): 

                filepath = os.path.join(path, name)

                with open(filepath) as f: 

                    s = f.read()

                s = s.replace(find, replace) 

                with open(filepath, "w") as f:

                    f.write(s) 
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1043  
  IPD(Integrated Product Development,集成产品开发)是一种系统化的产品开发方法论,旨在通过跨职能团队的协作,优化产品开发的效率和质量。IPD流程强调从市场需求出发,通过并行工程、跨部门协作和阶段性评审,确保产品从概念到上市的每个环节都高效且可控。随着敏捷开发方法的普及,越来越多的企业开始...
华为IPD流程   41  
  随着企业产品开发复杂度的提升以及市场需求的快速变化,传统的产品开发模式逐渐显现出局限性。集成产品开发(IPD)流程与敏捷开发(Agile Development)作为两种主流的开发方法论,分别从系统化管理和快速响应需求的角度为企业提供了解决方案。然而,单独使用其中一种方法往往无法完全满足企业在效率、质量和创新上的多重需...
华为IPD流程   35  
  华为IPD(Integrated Product Development,集成产品开发)流程是华为公司成功的关键因素之一。它不仅帮助华为在技术上实现了快速创新,还通过市场导向确保了产品的商业成功。IPD流程通过整合技术与市场双驱动,实现了从需求定义到产品交付的全生命周期管理。这种模式不仅提高了产品的开发效率,还降低了市...
IPD流程中PDCP是什么意思   32  
  在研发领域,集成产品开发(IPD)流程已经成为企业提升创新效率和市场竞争力的重要手段。然而,资源分配的不合理往往是制约IPD流程效率的关键因素之一。无论是人力资源、财务资源还是技术资源,如何高效分配直接关系到项目的成功与否。优化资源分配不仅能够缩短产品开发周期,还能降低研发成本,提升产品的市场竞争力。因此,掌握资源分配...
IPD流程中CDCP   34  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用