我试图让我的代码的这一部分检查每行输入是否遵循这个规则:字符串,然后" :",然后是整数。我写它的方式显然不起作用。任何线索?
这一行是问题所在:
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
答案 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:
...