分割一行文本以获取两个变量

时间:2019-04-27 02:45:20

标签: python python-3.x string

我对这个很迷失,我目前正在编写一个程序来从.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'”。

5 个答案:

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

Oneliner

(_, begin), (_, end) = list(map(lambda s: s.split(":"), line.split()))

首先,我将使用内置split通过内置将行分成两部分。接下来,我将使用map函数来应用lambda,它将进一步将行分为四个阶段,再次使用python中的字符串函数split。最后,使用tuple unpacking将值存储为beginend

希望这不会对您有所帮助。

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