项目验证和设置格式化

时间:2017-04-24 21:12:00

标签: python

我将解释我的代码的行为

  1. 您输入文件名和项目名称。

  2. 它将显示项目名称和列表中行的数量。

  3. 第一个问题:实际上,我希望它显示列表中的第二项并告诉它是重复的。目前,如果我删除list(set(),我会在同一个字符串中单独输出2个香蕉。

    我正在导入的.txt文件示例。

    bananes: 18
    pommes: 23
    bananes: 13
    

    我正在导入的.txt文件示例。

    pommes : 54
    : 18
    banane:
    
    oranges : 30
    

    输入示例:

    item.py data10.txt bananes
    

    所需输出的示例:

    La ligne banane : 13 est un doublon.
    

    输出我得到了:

    La ligne ['1', 's', ' ', 'e', ',', "'", '8', 'n', ':', 'b', '2', 'a'] est un doublon.
    

    第二个问题:如果我写任何其他单词而不是列表中的单词,这样可以正常工作。但实际上,如果我写下该单词的几个首字母,它仍会完全显示该行。

    输入示例:

    item.py data10.txt pomm
    

    所需输出的示例:

    pomm: 0
    

    我得到的输出:

    pomme: 30
    

    这是我的代码,因此您可以了解我的工作:

    import sys
    
    def ligne(texte):
        try:
            with open(texte) as ouvrir:
                lecture = ouvrir.readlines()
                words = [" : ".join([x.strip() for x in line.split(":")]) for line in lecture]
                words = [x for x in words if len(x) > 1]
                return words
        except IOError:
            print("Le fichier", texte, "n'existe pas.")
            sys.exit()
    
    def recherche(essaie):
        while True:
            if len(essaie) > 3:
                print("Deux arguments sont attendus, le nom du fichier d'inventaire et l'item")
                sys.exit()
            elif len(essaie) < 3:
                print("Il faut préciser le nom du fichier et de l'item.")
                sys.exit()
            else:
                entree = essaie[1]
                item = essaie[2]
                choix = str(entree)
                texte = choix.strip("[']")
                resultat = [s for s in ligne(texte) if item in s]
                resultat2 = str(resultat)
                longueur = len(resultat)
                resultat3 = resultat2.strip("[']")
                resultat4 = list(set(resultat3))
                if item in str(ligne(texte)):
                    if longueur > 1:
                        print("La ligne", resultat4, "est un doublon.")
                        sys.exit()
                    else:
                        print(resultat3)
                        sys.exit()
                else:
                    print(item, ": 0")
                    sys.exit()
    
    if __name__ == "__main__":
        recherche(sys.argv)
    

1 个答案:

答案 0 :(得分:2)

您可能需要考虑使用字典来解决此问题,而不是列表/字符串集。您可以在行中读取键/值对,然后检查键中是否已存在键。如果是这样,它就是重复并引发异常(如果你愿意,你可以用它代替打印的字符串和sys.exit(0)。

检查下面的示例代码......

import sys

def ligne(texte, item):
    try:
        with open(texte) as ouvrir:
            words_dict = {} #Create new, empty dictionary
            lecture = ouvrir.readlines()
            for line in lecture: #For each line in .txt file
                line = line.strip('\n')
                key, number = line.split(':')[0], int(line.split(':')[1]) #Item is before ':', value is after
                if key not in words_dict.keys(): 
                    words_dict[key] = number #If that item isn't in the dictionary yet (this is the first occurence), add it
                elif key == item: #If the duplicate is the inputed item
                    raise Exception('La ligne {} est un doublon.'.format(line)) #If that item is already in the dictionary, raise an exception
            return words_dict #If there are no duplicates, the dictionary will be returned, if there are, it will return the error above
    except IOError:
        print("Le fichier", texte, "n'existe pas.")
        sys.exit()

def recherche(essaie):
    if len(essaie) > 3:
        print("Deux arguments sont attendus, le nom du fichier d'inventaire et l'item")
        sys.exit()
    elif len(essaie) < 3:
        print("Il faut preciser le nom du fichier et de l'item.")
        sys.exit()
    else:
        entree = essaie[1]
        item = essaie[2]

        choix = str(entree)
        texte = choix.strip("[']")
        resultat_dict = ligne(texte, item) #If this returns without raising an exception, there were no duplicates

        if item in resultat_dict.keys():
            print item, ": {}".format(resultat_dict[item]) #If the item was in the .txt file, print it and its value
        else:
            print item, ": 0" #If not, print with a value of zero

if __name__ == "__main__":
    recherche(sys.argv)

我试着留下评论来解释所有的变化,但如果有什么不清楚,请告诉我。关键的变化是将文件读入字典并在发现重复时引发异常,但我尽可能地保持原始代码的结构完整(尽管可能有更简单的方法/更有效的方法去吧)。 recherche函数的最后一部分也变得更简单,因为你知道如果ligne返回没有错误,就没有重复。