I'am, плохо знакомый с Python 3 и, мог действительно использовать немного справки. У меня есть txt файл, содержащий:
InstallPrompt=
DisplayLicense=
FinishMessage=
TargetName=D:\somewhere
FriendlyName=something
У меня есть сценарий Python, на который в конце, должен изменить всего две строки:
TargetName=D:\new
FriendlyName=Big
Кто-либо мог помочь мне? Я попытался искать его, но я не нашел что-то, что я мог использовать. Текст, который должен быть заменен, мог иметь другую длину.
Очень простое решение того, что вы делаете:
#!/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
Запись во временный файл и переименование - лучший способ убедиться, что вы не получите поврежденный файл, если что-то пойдет не так.
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)
Это файл конфигурации (.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
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
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)