检查行是否格式化为字符串和整数

时间:2017-04-18 18:56:31

标签: python

我试图让我的代码的这一部分检查每行输入是否遵循这个规则:字符串,然后" :",然后是整数。我写它的方式显然不起作用。任何线索?

这一行是问题所在:

i = str(i) + int(i)

这是我的整个代码。它只是一个命令单词然后显示它们的代码。

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 main():
    while True:
        entree = sys.argv[1:]
        choix = str(entree)
        texte = choix.strip("[']")
        if len(entree) > 1:
            print("Un seul argument est attendu, soit le nom du fichier à traiter")
            sys.exit()
        else:
            if texte in choix:
                message4 = sorted(ligne(texte))
                for i in message4:
                    try:
                        i = str(i) + int(i)
                        print(i)
                    except ValueError:
                        print("La ligne '", i, "' n'est pas correctement formaté.")
                        sys.exit()
                break
            else:
                print("Il faut préciser le nom du fichier à traiter")
                break

if __name__ == "__main__":
    main()

列表示例:

pommes : 54
bananes : 18
oranges : onze

4 个答案:

答案 0 :(得分:2)

Mais bien sur。 : - )

在您的代码中, i 是整行。您将整个行转换为字符串;然后你将再次转换为整数;您尝试添加这些值,这将始终失败。

要正确执行此操作,请使用

拆分您的行
parts = i.split(':')

如果部分中只有两个元素,请继续。第一部分是定义的字符串:任何字符序列都是字符串。取第二部分部分[1] ,并检查其是否是有效整数。有几种很好的方法可以做到这一点,你可以在网上找到。最简单的可能接近你已经在做的事情:

try:
    droit = int(parts[1])
except:
    # print your error message

gauche = parts[0].strip()   # take left side of colon; remove outside spaces.
if not gauche.isalpha():
    # print your error message

Est-ce que je vousaiadidé? Pardonnez ma Francais,elle n'est pas si bonne ...

回复“它没有用”

以下是一小段代码:

ligne = [ 
    "pommes : 54",
    "bananes : 18",
    "oranges : onze"
    ]       
message4 = sorted(ligne)
for i in message4:
    parts = i.split(':')
    gauche = parts[0].strip()
    droit  = parts[1]
    print(gauche, droit)
    try:
        doirt = int(droit)
    except ValueError:
        print("La ligne '", i, "' n'est pas correctement formaté.")

    if not gauche.isalpha():
        print("La ligne '", i, "' n'est pas correctement formaté.")

输出:

bananes  18
oranges  onze
La ligne ' oranges : onze ' n'est pas correctement formaté.
pommes  54

C'est bien?

答案 1 :(得分:2)

据我所知,您希望通过检查格式为string:integer的格式来检查给定行是否格式正确

if texte in choix:
    message4 = sorted(ligne(texte))
    for i in message4:
        data = i.split(":")
        data[0] = data[0].strip()
        data[1] = data[1].strip()
        try:
            if(isinstance(int(data[1]), int)):
                print(i)
        except ValueError:
            print("La ligne '", i, "' n'est pas correctement formaté.")
            sys.exit()
        break
else:
    print("Il faut préciser le nom du fichier à traiter")
    break

如果没有,则检查第二部分是否为int然后打印""La ligne '", i, "' n'est pas correctement formaté."

看到您的输入格式后,您可能还想使用.strip()删除任何空格

答案 2 :(得分:2)

作为已经给出的答案的一个可能的高级替代方案,我想告诉您这是使用regular expression的一个很好的案例。

import re

STRING_INT_RE = re.compile(r'(.+?)\s*:\s*(\d+)')

def parse_string_int(line):
    match = STRING_INT_RE.match(line)
    if not match:
        raise ValueError('expected input in format "<string> : <integer>"')
    s, i = match.groups()
    return s, int(i)

上面的正则表达式由几个部分组成,这些部分描述了您希望与输入字符串匹配的格式:

(.+?)   # 1. a string of one or more of any character
\s*:\s* # 2. a colon surrounded by zero or more spaces
(\d+)   # 3. one or more digits

第1部分和第3部分周围的()可以通过匹配对象的groups()方法访问它们。

第1部分中的?使其“非贪婪”,这意味着它匹配最短的可能字符串,否则它会消耗整个输入行,不会留下第2和第3部分匹配的字符。

如果将其加载到交互式Python会话中,您可以看到它的工作原理:

>>> parse_string_int('pommes : 54')
('pommes', 54)
>>> parse_string_int('bananes : 18')
('bananes', 18)
>>> parse_string_int('oranges : onze')
…
ValueError: expected input in format "<string> : <integer>"

答案 3 :(得分:1)

可能你的意思是将你的字符串分成' : '分隔符上的两个字段,并检查第二个字段是否可以转换为整数:

for line in message4:
    fields = line.split(' : ')
    try:
        i = int(fields[1])
    except ValueError:
        ...