2010-03-26 126 views
4

我是Python 3的新手,真的可以使用一些帮助。我有一个包含一个txt文件:替换txt文件中的整行

InstallPrompt= 

DisplayLicense= 

FinishMessage= 

TargetName=D:\somewhere 

FriendlyName=something 

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

TargetName=D:\new 

FriendlyName=Big 

谁能帮帮我,好吗?我试图寻找它,但我没有找到我可以使用的东西。应该替换的文本可以有不同的长度。

回答

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

+0

你应该编译的正则表达式代替。 – ghostdog74 2010-03-26 23:55:29

+1

@ ghostdog74:不,regexps是由're'模块自动编译并缓存的。 – nosklo 2010-03-27 00:02:53

+1

我以为只有最近的正则表达式被缓存了 – 2010-03-27 00:18:55

3
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) 
+0

print是Python3中的一个函数 – 2010-03-27 00:21:15

1

写入到一个临时文件,重命名是最好的确保在出现问题时不会损坏文件的方法

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

这是你试图解析的配置文件(.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