在字典中添加重复

时间:2017-04-27 18:55:06

标签: python

我有一个将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)

5 个答案:

答案 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时,您只需写下您从用户输入获得的nombreitem的值。如果我理解您的问题,如果该项与用户输入的内容不匹配,您希望保持输入文件中的数字不变。然后,您需要在mot块中将chiffreelse写入文件。此外,如果您在system.exit()区块内拨打returnif,则不会检查原始文件中的所有项目。

答案 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)

您的代码:

  • 打开追加
  • 的文件
  • 读取所有行
  • (尝试)循环线
    • 获得第一行
    • 对其进行解码
    • 然后如果是输入项:
      • 递增计数器
      • 写入文件
      • 关闭文件
      • 你做 sys.exit()
      • 确实返回,退出循环,功能,......一切
    • 除了增量
    • 之外,其他方面如上所述

现在再次阅读并注意到你的“错误”

代码应该是我的

'''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