Заменить целую строку в текстовом файле - PullRequest
5 голосов
/ 27 марта 2010

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

InstallPrompt=

DisplayLicense=

FinishMessage=

TargetName=D:\somewhere

FriendlyName=something

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

TargetName=D:\new

FriendlyName=Big

Может ли кто-нибудь помочь мне, пожалуйста? Я пытался найти его, но я не нашел что-то, что я мог бы использовать. Текст, который следует заменить, может иметь разную длину.

Ответы [ 5 ]

5 голосов
/ 27 марта 2010
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)
2 голосов
/ 27 марта 2010

Это файл конфигурации (.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
2 голосов
/ 27 марта 2010

Запись во временный файл и переименование - лучший способ убедиться, что вы не получите поврежденный файл, если что-то пойдет не так

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)
2 голосов
/ 27 марта 2010

Очень простое решение для того, что вы делаете:

#!/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 голосов
/ 27 марта 2010

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...