替换文本文件中的整行

时间:2010-03-26 23:27:20

标签: python text replace python-3.x

我是Python 3的新手,可以真正使用一些帮助。我有一个包含以下内容的txt文件:

InstallPrompt=

DisplayLicense=

FinishMessage=

TargetName=D:\somewhere

FriendlyName=something

我有一个python脚本,最后应该只改变两行:

TargetName=D:\new

FriendlyName=Big
是的,有人可以帮帮我吗?我试图搜索它,但我找不到我能用的东西。应该替换的文本可以有不同的长度。

5 个答案:

答案 0 :(得分:5)

import fileinput
for line in fileinput.FileInput("file",inplace=1):
    sline=line.strip().split("=")
    if sline[0].startswith("TargetName"):
        sline[1]="new.txt"
    elif sline[0].startswith("FriendlyName"):
        sline[1]="big"
    line='='.join(sline)    
    print(line)

答案 1 :(得分:2)

您正在做的事情的一个非常简单的解决方案:

#!/usr/bin/python
import re
import sys
for line in open(sys.argv[1],'r').readlines():
  line = re.sub(r'TargetName=.+',r'TargetName=D:\\new', line)
  line = re.sub(r'FriendlyName=.+',r'FriendlyName=big', line)
  print line,

您可以从命令行调用./test.py myfile.txt > output.txt

答案 2 :(得分:2)

写入临时文件并重命名是确保在出现问题时不会损坏文件的最佳方法

import os
from tempfile import NamedTemporaryFile
fname = "lines.txt"

with open(fname) as fin, NamedTemporaryFile(dir='.', delete=False) as fout:
    for line in fin:
        if line.startswith("TargetName="):
            line = "TargetName=D:\\new\n"
        elif line.startswith("FriendlyName"):
            line = "FriendlyName=Big\n"
        fout.write(line.encode('utf8'))
    os.rename(fout.name, fname)

答案 3 :(得分:2)

这是您尝试解析的配置(.ini)文件吗?该格式看起来非常相似,除了没有标题部分。您可以使用configparser,但它可能会在“=”符号周围添加额外的空格(即“TargetName=D:\new”与“TargetName = D:\new”),但如果这些更改无关紧要你,使用configparser比每次尝试手工解析更容易,更容易出错。

txt(ini)文件:

[section name]

FinishMessage=

TargetName=D:\something

FriendlyName=something

代码:

import sys
from configparser import SafeConfigParser

def main():
    cp = SafeConfigParser()
    cp.optionxform = str # Preserves case sensitivity
    cp.readfp(open(sys.argv[1], 'r'))
    section = 'section name'
    options = {'TargetName': r'D:\new',
               'FriendlyName': 'Big'}
    for option, value in options.items():
        cp.set(section, option, value)
    cp.write(open(sys.argv[1], 'w'))

if __name__ == '__main__':
    main()

txt(ini)文件(之后):

[section name]

FinishMessage = 

TargetName = D:\new

FriendlyName = Big

答案 4 :(得分:0)

subs_names.py脚本适用于Python 2.6+和Python 3.x:

#!/usr/bin/env python
from __future__ import print_function
import sys, fileinput

# here goes new values
substitions = dict(TargetName=r"D:\new", FriendlyName="Big")

inplace = '-i' in sys.argv # make substitions inplace
if inplace:
   sys.argv.remove('-i')

for line in fileinput.input(inplace=inplace):
    name, sep, value = line.partition("=")
    if name in substitions:
       print(name, sep, substitions[name], sep='')
    else:
       print(line, end='')

示例:

$ python3.1 subs_names.py input.txt
InstallPrompt=

DisplayLicense=

FinishMessage=

TargetName=D:\new

FriendlyName=Big

如果您对输出感到满意,请添加-i参数以进行更改:

$ python3.1 subs_names.py -i input.txt