【问题标题】:How to pass arguments to a file in command line and change string inside file using python?如何在命令行中将参数传递给文件并使用python更改文件内的字符串?
【发布时间】:2019-06-25 09:02:13
【问题描述】:

我有一个文件 requirements.txt 文件。以下文本如下。如何更改 django 和 flask 的值并通过作为命令行参数传递来更新文件

requirement.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 flask=2.0

requirements.txt 的输出

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

【问题讨论】:

标签: python regex file-io command-line arguments


【解决方案1】:
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)

【讨论】:

  • with open('filename', 'w') as fr: 感谢它的工作正常
  • 如何提高您的 Python 技能。你能告诉我吗:)
【解决方案2】:

我想你可能想看看 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)

【讨论】:

  • 我试过 argparse。做不到。我认为stackoverflow中的一些人会有所帮助。您的代码也可以正常工作
【解决方案3】:

使用方便的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

【讨论】:

    【解决方案4】:

    使用“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
    • @Mous 我发现了错误。将D[arguments[0]]=arguments 替换为D[arguments[0]]=arguments[1]
    猜你喜欢
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 2011-03-14
    • 2010-11-20
    相关资源
    最近更新 更多