2010-03-26 3 views
4

Я новичок в Python 3 и действительно могу использовать небольшую помощь. У меня есть текстовый файл, содержащий:Замените целую строку в txt-файле

InstallPrompt= 

DisplayLicense= 

FinishMessage= 

TargetName=D:\somewhere 

FriendlyName=something 

У меня есть питон скрипт, который, в конце концов, должны изменить только две строки в:

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

+1

@ ghostdog74: nah, regexps автоматически скомпилируются модулем 're' и кэшируются. – nosklo

+1

Я думал, что только последнее регулярное выражение было кэшировано –

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 –

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

скрипт работает как 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 параметр, чтобы внести изменения Inplace:

$ 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 
Смежные вопросы