如何逐行读取文件并仅在python中打印具有特定字符串的行?

时间:2017-06-12 10:59:49

标签: python

我有一个包含这些行的文本文件

wbwubddwo 7::a number1 234 **
/// 45daa;: number2 12

time 3:44

我正在尝试打印,例如,如果程序找到字符串number1,它将打印234

我从下面的简单脚本开始,但它没有打印出我想要的内容。

with open("test.txt", "rb") as f:
    lines = f.read()
    word = ["number1", "number2", "time"]
    if any(item in lines for item in word):
        val1 = lines.split("number1 ", 1)[1]
        print val1

返回以下结果

234 **
/// 45daa;: number2 12

time 3:44

然后我尝试将f.read()更改为f.readlines(),但这次没有打印出任何内容。

有谁知道其他方法吗?最后,我想获取每行的值,例如234123:44,并将其存储在数据库中。

感谢您的帮助。我真的很感激。

3 个答案:

答案 0 :(得分:1)

下面给出的解释:

with open("test.txt", "r") as f:
    lines = f.readlines()
    stripped_lines = [line.strip() for line in lines]

words = ["number1", "number2", "time"]
for a_line in stripped_lines:
    for word in words:
        if word in a_line:
            number = a_line.split()[1]
            print(number)

1)首先' rb'给出字节对象,即b'number1 234'之类的东西将被返回使用' r'获取字符串对象。

2)您阅读的行将是这样的,它将存储在列表中。

['number1 234\r\n', 'number2 12\r\n', '\r\n', 'time 3:44']

请注意\r\n那些指定您有换行符的人。要删除使用strip()

3)从line中取出每个stripped_lines并从word中取出每个words 并使用in检查该行中是否存在该单词。

4)a_line将是number1 234,但我们只想要数字部分。所以split() 输出将是

['number1','234']split()[1]表示索引1处的元素。(第2个元素)。

5)您还可以使用your_string.isdigit()

检查字符串是否为数字

更新: 由于您更新了问题和输入文件,因此无效:

import time

def isTimeFormat(input):
    try:
        time.strptime(input, '%H:%M')
        return True
    except ValueError:
        return False

with open("test.txt", "r") as f:
    lines = f.readlines()
    stripped_lines = [line.strip() for line in lines]

words = ["number1", "number2", "time"]
for a_line in stripped_lines:
    for word in words:
        if word in a_line:
            number = a_line.split()[-1] if (a_line.split()[-1].isdigit() or isTimeFormat(a_line.split()[-1]))  else a_line.split()[-2] 
            print(number)

为什么这个isTimeFormat()功能?

def isTimeFormat(input):
        try:
            time.strptime(input, '%H:%M')
            return True
        except ValueError:

检查3:44或4:55是时间格式。因为你也把它们视为价值观。 最终输出:

234
12
3:44

答案 1 :(得分:0)

经过一番尝试和错误后,我找到了类似下面的解决方案。这是基于@s_vishnu提供的答案

with open("test.txt", "r") as f:
    lines = f.readlines()
    stripped_lines = [line.strip() for line in lines]

    for item in stripped_lines:
        if "number1" in item:
            getval = item.split("actual ")[1].split(" ")[0]
            print getval

        if "number2" in item:
            getval2 = item.split("number2 ")[1].split(" ")[0]
            print getval2

        if "time" in item:
            getval3 = item.split("number3 ")[1].split(" ")[0]
            print getval3

输出

234
12
3:44

这样,我还可以做其他事情,例如将每个数据保存到数据库。

我愿意接受任何进一步改善答案的建议。

答案 2 :(得分:-1)

你正在过度思考这个问题。假设您在第一行末尾没有这两个星号,并且您想要打印出包含特定值的行,您可以逐行读取文件,检查是否有任何选定的值匹配,打印出最后一个值(空格和行尾之间的值) - 根本不需要解析/拆分整行:

search_values = ["number1", "number2", "time"]  # values to search for

with open("test.txt", "r") as f:  # open your file
    for line in f:  # read it it line by line
        if any(value in line for value in search_values):  # check for search_values in line
            print(line[line.rfind(" ") + 1:].rstrip())  # print the last value after space

哪个会给你:

234
12
3:44

如果你有星号,你必须更精确地定义你的文件格式,因为拆分不一定会产生你想要的值。