Как передать аргументы в файл в командной строке и изменить строку внутри файла с помощью python?

У меня есть файл require.txt. следующий текст приведен ниже. Как изменить значение для django и flask и обновить файл, передав его в качестве аргумента командной строки.

требование.txt

 numpy=1.14
 pandas=1.4
 django=1.6
 flask=1.4

мой python file.py ниже

 import sys
 import re
 program_name = sys.argv[0]
 arguments = sys.argv[1:]
 print (arguments[0])
 print (arguments[1])
 with open('requirement.txt ', 'r') as fr:
     data = fr.readlines()
     with open('requirement.txt ', 'a') as fw:
     fw.write(....)

python file.py django = 2.1 фляга = 2.0

вывод требования.txt

 numpy=1.14
 pandas=1.4
 django=2.1 
 flask=2.0

Возможный дубликат Как искать и заменять текст в файле с помощью Python?

mrzasa 25.06.2019 11:15

@Mak, отметьте docs.python.org/3/library/fileinput.html, чтобы отредактировать файл на месте

RomanPerekhrest 25.06.2019 11:47
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
1 244
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий
import re
import sys

arguments = dict(i.split(" = ") for i in sys.argv[1:])   #CMD line Arguments.
with open('requirement.txt', 'r') as fr:         #Read content
    data = fr.read()

for k, v in arguments.items():
    data = re.sub(r"{}=(.*)".format(k), "{} = {}".format(k,v), data)   #Update content

with open(filename, 'w') as fr:              #Write back data. 
    fr.write(data)

с open('filename', 'w') as fr: Спасибо, все работает нормально

user6882757 25.06.2019 11:25

как вы улучшаете свои навыки Python. Можете ли вы дать мне знать :)

user6882757 25.06.2019 11:29

Использование «a» означает, что у вас будет два требования одного типа, например:

numpy=1.14
pandas=1.4
django=1.6
flask=1.4
django=2.1 
flask=2.0

Вместо этого вы должны перезаписать файл обновленным списком требований.

Сначала загрузите данные и поместите их в словарь:

fr=open('requirement.txt ', 'r')
L=fr.read().split("\n") #Better than .readlines(), since it removes '\n'
fr.close() #Very important, since you're going to write back into it.
D=dict()
for e in L:
    E=e.split(" = ")
    if len(E)<2:
        continue
    D[E[0]]=E[1]

Затем примените аргументы к словарю:

D[arguments[0]]=arguments[1]

Наконец, поместите данные словаря обратно в строку и перезапишите файл:

result = "\n".join([e+" = "+D[e] for e in D])
fw=open('requirement.txt ', 'a')
fw.write(result)
fw.close()

что должно дать желаемый результат.

Кроме того, вы должны следить за порядком ключей в списке, если хотите его сохранить.

Можете ли вы проверить это, потому что result = "\n".join([e+" = "+D[e] for e in D]), выдаст ошибку, потому что мы пытаемся объединить список в str, потому что D[arguments[ 0] это список, а не str

user6882757 25.06.2019 11:50

@ Мышь, я нашел ошибку. Замените D[arguments[0]]=arguments на D[arguments[0]]=arguments[1]

Dorijan Cirkveni 26.06.2019 13:23

Я думаю, вы можете проверить argparse: https://docs.python.org/2/library/argparse.html

В противном случае вы можете сделать это следующим образом:

import sys

requirements = {}

# Save a list of requirements
with open('requirement.txt', 'r') as file:
  for line in file:
    line = line.strip("\n").split(" = ")
    requirements[line[0]] = line[1]

# Change requirements values
for command in sys.argv[1:]:
  command = command.split(" = ")
  requirements[command[0]] = command[1]

# Write requirements back to file
with open('requirement.txt', 'w') as file:
  for r, v in requirements.items():
    line = "{} = {}\n".format(r, v)
    file.write(line)

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

user6882757 25.06.2019 11:39

С удобным модулем файлввод - редактирование в проходе один:

import sys
import fileinput

program_name = sys.argv[0]
args = sys.argv[1:]

if not args:    # ensuring replacement items were passed
    sys.exit('No items to replace')

args_dict = dict(arg.split('=') for arg in args)
keys_tuple = tuple(args_dict.keys())

for line in fileinput.input(files='requirements.txt', inplace=True):
    if line.startswith(keys_tuple):
        name, version = line.split('=')
        line = line.replace(version, args_dict[name])
    print(line.strip())

Окончательное содержимое файла requirements.txt:

numpy=1.14
pandas=1.4
django=2.1
flask=2.0

Другие вопросы по теме