我对这个很迷失,我目前正在编写一个程序来从.txt文档获取输入,第一行说:“ From:0 To:4”,我的目标是得到“ 0” “和“ 4”值。
这是我目前正在做的事情
with open('graph.txt') as matrix:
linea = matrix.readlines()
for line in linea:
if line.startswith('From:'):
start = line.rsplit(':')[-1].strip()
start= int(start,10)
elif line.__contains__('To:'):
end = line.split(':')[-1].strip()
end = int(end,10)
之所以这样,是因为在“ from:”和“ to:”之前有两个不同的行,但是我需要将它们设置在同一行中。现在的难题是,每当我运行代码时,我都会得到“ NameError:未定义名称'end'”。
答案 0 :(得分:0)
最简单的灵活方法是使用正则表达式:
import re
with open('graph.txt') as matrix:
for line in matrix:
from_, to = re.findall(r':(\d+)', line)
这会将两个数字数据提取到两个变量from_
和to
中。
答案 1 :(得分:0)
您的代码的主要问题是elif
-由于执行if
块,elif
从不执行,因此end
从未设置。将elif
更改为if
将导致两个if
块都执行,因此两个变量都被设置。
尽管如此,您最终会得到一些重复的代码,这对(DRY)来说是不满意的
@鲍里斯的评论也很重要,您不必致电__contains__
我想出了不同于Austin的正则表达式,后者将空格和冒号分开以标记该行:
import re
with open('matrix.txt') as matrix:
linea = matrix.readlines()
for line in linea:
split = re.split('\s|:', line)
start, end = (split[1], split[3])
print(f"{start} {end}")
答案 2 :(得分:0)
您应该使用正则表达式从字符串中提取所有可能的数字。不管数字周围是否有任何字符串,下面的代码都可以正常工作。
import re
with open('graph.txt') as matrix:
for line in matrix:
start, end = re.findall(r'(\d+)', line)
print(start)
print(end)
因此,如果文件看起来像这样:
From: 0 To: 4
From:0 To: 4
From: 123To: 456
From 12 to 34
输出将为
0
4
0
4
123
456
12
34
如您所见,无论字符串的格式如何,都提取了所有数字。
答案 3 :(得分:-1)
(_, begin), (_, end) = list(map(lambda s: s.split(":"), line.split()))
首先,我将使用内置split
通过内置将行分成两部分。接下来,我将使用map
函数来应用lambda
,它将进一步将行分为四个阶段,再次使用python中的字符串函数split
。最后,使用tuple unpacking
将值存储为begin
和end
。
希望这不会对您有所帮助。
答案 4 :(得分:-2)
下面的代码将读取您想要的内容。
with open('graph.txt') as matrix:
linea = matrix.readlines()
for line in linea:
if line.startswith('From:'):
start = line.split('From:')
#start= int(start,10)
print(start)
for a in start:
if a.__contains__('To:'):
b = a.split('To:')
print(b[0].strip(),b[1].strip())
还有另一个类似于您的代码的选项:
with open('graph.txt') as matrix:
linea = matrix.readlines()
for line in linea:
d = line.split(' ')
print(d)
for elm in d:
if elm.__contains__('From:'):
print(elm.split(':')[-1].strip())
elif elm.__contains__('To:'):
print(elm.split(':')[-1].strip())