我有一个将2 sys argv写入txt文件的小代码。
首先,在我想要的文件中写入的一切都很好,但问题是如果用户输入它并且它已经在列表中,我想添加项目数。
输入示例
up.py 1.txt apple 23
txt文件的示例
apple : 20
orange : 28
预期产出
apple : 43
orange : 28
我尝试的是将文件作为字典,然后在我的代码中添加值chiffre我不明白为什么它不像我输入的那样工作。
def maj(texte, item, nombre):
with open(texte, "a") as ouvrir:
mots_dict = {}
lecture = ouvrir.readlines()
for line in lecture:
line = line.strip("\n")
mot, chiffre = line.split(" : ")[0].strip(" "), int(line.split(" : ")[1].strip(" "))
if mot == item:
sum(mots_dict.values(chiffre))
ouvrir.write("%s : %s" "\n" % (item, nombre))
ouvrir.close()
message = sys.exit()
return message
else:
ouvrir.write("%s : %s" "\n" % (item, nombre))
ouvrir.close()
message = sys.exit()
return message
def main():
entree = sys.argv[1]
item = sys.argv[2]
nombre = sys.argv[3]
choix = str(entree)
texte = choix.strip("[']")
maj(texte, item, nombre)
答案 0 :(得分:1)
试试这个:
import json
def add_from_raw(dict1,key,value):
dict1['key']=dict1.get(key,0)+value
json.dumps(dict1,open('file1.json','w'))
if __name__=="__main__"
filename=sys.argv[1]
key=sys.argv[2]
value = sys.argv[3]
dict1=json.load(open(filename))
add_from_raw(dict1,key,value)
JSON更适合格式化来存储和查询数据。
答案 1 :(得分:1)
我注意到您将mots_dict
初始化为空白字典,但您不能添加任何内容。
所以当你sum(mots_dict.values())
时,它会返回0。
如果您不想更改为JSON,并且如果您之后未在其他任何地方使用该词典,则可以将该部分保留下来,并在此处执行此操作:
def maj(texte, item, nombre):
with open(texte, "r") as f_in:
lecture = f_in.readlines()
with open(texte, "w") as ouvrir:
for line in lecture:
line = line.strip("\n")
mot, chiffre = line.split(" : ")[0].strip(" "), int(line.split(" : ")[1].strip(" "))
if mot == item:
ouvrir.write("%s : %s" "\n" % (item, str(chiffre + int(nombre))))
else:
ouvrir.write("%s : %s" "\n" % (mot, chiffre))
我注意到的另一件事是,当您写入ouvrir
时,您只需写下您从用户输入获得的nombre
和item
的值。如果我理解您的问题,如果该项与用户输入的内容不匹配,您希望保持输入文件中的数字不变。然后,您需要在mot
块中将chiffre
和else
写入文件。此外,如果您在system.exit()
区块内拨打return
或if
,则不会检查原始文件中的所有项目。
答案 2 :(得分:0)
主要失败是因为您的程序没有可以添加任何内容的代码。最接近的是 sum 语句,您将其应用于字符串列表 - 将 chiffre (另一个字符串)作为参数。 sum 适用于一系列数字。
您需要将输入值和字典中一个标识的值转换为整数。然后添加" +"和然后,你可以写出结果。
答案 3 :(得分:0)
你的maj
方法有点尴尬,所以我以更清洁的方式重写了它。这可以实现所需的输出,同时保持main
方法不变。
import sys
def maj(filename, input_name, input_num):
with open(filename, 'r') as f:
for line in f:
as_list = list(map(lambda x: x.strip(), line.split(':')))
name = as_list[0]
num = int(as_list[1])
if name == input_name:
print(name + ' : ' + str(num + int(input_num)))
else:
print(line)
def main():
entree = sys.argv[1]
item = sys.argv[2]
nombre = sys.argv[3]
choix = str(entree)
texte = choix.strip("[']")
maj(texte, item, nombre)
main()
通过运行
在您的示例上测试它python test.py 1.txt apple 23
给出您要求的输出:
apple : 43
orange : 28
编辑:也许您希望将输出写入文件?这很容易实现,我将在这里添加代码:
import sys
def maj(input_filename, input_name, input_num, output_filename):
with open(input_filename, 'r') as f_in:
with open(output_filename, 'w') as f_out:
for line in f_in:
as_list = list(map(lambda x: x.strip(), line.split(':')))
name = as_list[0]
num = int(as_list[1])
if name == input_name:
f_out.write(name + ' : ' + str(num + int(input_num)) + '\n')
else:
f_out.write(line)
def main():
entree = sys.argv[1]
item = sys.argv[2]
nombre = sys.argv[3]
choix = str(entree)
texte = choix.strip("[']")
maj(texte, item, nombre, 'my_test_output.txt')
main()
这会将结果写入my_test_output.txt
。
答案 4 :(得分:0)
您的代码:
现在再次阅读并注意到你的“错误”
代码应该是我的
'''filename: up.py'''
def get_stored_data(texte):
stored_data = {}
with open(texte, "r") as ouvrir:
for line in ouvrir.readlines():
if not line: continue
line = line.split(":")
stored_data[line[0].strip()] = int(line[1].strip())
return stored_data
def store_data(texte,data):
with open(texte, "w") as ouvrir:
for item, nombre in data.iteritems():
ouvrir.write("%s : %s" "\n" % (item, nombre))
def maj(input_filename, input_name, input_num, output_filename):
data = get_stored_data(input_filename)
data[input_name] = data.get(input_name, 0) + int(input_num)
store_data(output_filename, data)
def main():
entree = sys.argv[1]
item = sys.argv[2]
nombre = sys.argv[3]
choix = str(entree)
texte = choix.strip("[']")
maj(texte, item, nombre, 'my_test_output.txt')
main()
测试了它
$ cat 1.txt
apple : 20
orange : 28
$ python up.py 1.txt apple 23
$ cat my_test_output.txt
orange : 28
apple : 43
由于某种原因,你正在阅读文件并将结果写入另一个,但这不是我的事业
您希望输出文件保留输入文件中的顺序,用户OrderedDict
而不是dict
中的普通get_stored_data
,代码将
def get_stored_data(texte):
from collections import OrderedDict
stored_data = OrderedDict()
with open(texte, "r") as ouvrir:
for line in ouvrir.readlines():
if not line:
continue
line = line.split(":")
stored_data[line[0].strip()] = int(line[1].strip())
return stored_data