Замените целую строку в txt файле

I'am, плохо знакомый с Python 3 и, мог действительно использовать немного справки. У меня есть txt файл, содержащий:

InstallPrompt=

DisplayLicense=

FinishMessage=

TargetName=D:\somewhere

FriendlyName=something

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

TargetName=D:\new

FriendlyName=Big

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

5
задан Jordan Running 26 March 2010 в 23:31
поделиться

5 ответов

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

#!/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
ответ дан 13 December 2019 в 19:24
поделиться

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

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
ответ дан 13 December 2019 в 19:24
поделиться

Это файл конфигурации (.ini), который вы пытаетесь проанализировать? Формат выглядит подозрительно похожим, за исключением раздела заголовка. Вы можете использовать configparser , хотя он может добавить дополнительное пространство вокруг знака "=" (например, " TargetName = D: \ new " vs. " 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
ответ дан 13 December 2019 в 19:24
поделиться

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
0
ответ дан 13 December 2019 в 19:24
поделиться
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)
5
ответ дан 13 December 2019 в 19:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: