如何在命令行中将参数传递给文件并使用 python 更改文件内的字符串?
How to pass arguments to a file in command line and change string inside file using python?
我有一个文件 requirement.txt 文件。以下文本 below.How 用于更改 django 和 flask 的值并通过作为命令行参数传递来更新文件
requirement.txt
numpy=1.14
pandas=1.4
django=1.6
flask=1.4
我的pythonfile.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 flask=2.0
requirement.txt的输出
numpy=1.14
pandas=1.4
django=2.1
flask=2.0
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)
使用'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()
应该会得到想要的结果。
此外,如果您希望保留列表中的键的顺序,您应该跟踪它。
我想你可能想看看 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)
使用方便的fileintput模块-编辑一个通过:
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
我有一个文件 requirement.txt 文件。以下文本 below.How 用于更改 django 和 flask 的值并通过作为命令行参数传递来更新文件
requirement.txt
numpy=1.14
pandas=1.4
django=1.6
flask=1.4
我的pythonfile.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 flask=2.0
requirement.txt的输出
numpy=1.14
pandas=1.4
django=2.1
flask=2.0
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)
使用'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()
应该会得到想要的结果。
此外,如果您希望保留列表中的键的顺序,您应该跟踪它。
我想你可能想看看 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)
使用方便的fileintput模块-编辑一个通过:
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