使用Python在文本文件中找到变量后如何读取下一行?

问题描述 投票:0回答:3

我正在尝试为电动汽车司机制作一个应用程序,我正在使用一个文本文件来存储数据,它的工作方式是我有电动汽车的名称,名称下的行包含它可以获得的英里数每 1%,我已经得到它,所以它可以找到特定的汽车,但我无法使用该数字找到车辆的范围。

cars.txt

MG MG4 EV Long Range
2.25
BMW iX1 xDrive30
2.3
Kia Niro EV
2.4
Tesla Model Y Long Range Dual Motor
2.7
BMW i4 eDrive40
3.2

code

with open('cars.txt', 'r')as cars:
    check = input("Enter full name of car: ")
    car = cars.read()
    percentage = cars.readline()
    if check in car:
        print("Found")
    total = range
    print(percentage)

这就是我所拥有的,但每次它找到汽车时都找不到它后面的范围。

python text-files read-write
3个回答
2
投票

我建议将文件读入字典,然后使用该字典查找汽车,例如:

data = []
with open("cars.txt", "r") as f_in:
    for line in map(str.strip, f_in):
        if line == "":
            continue
        data.append(line)

data = dict(zip(data[::2], data[1::2]))

name = input("Enter full name of car: ")
print(data.get(name, "Not Found"))

打印:

Enter full name of car: Kia Niro EV
2.4

0
投票

您可以执行以下操作:

target_car = "Kia Niro EV"

with open("temp.txt") as f:
    for line in f:
        if line.rstrip() == target_car:
            range_ = float(next(f))
            break
    else:
        range_ = "Not Found"
print(f"range is: {range_}")

f
是一个消耗性迭代器。您对其进行迭代,直到找到您的汽车,然后该迭代器中的下一个项目就是您要查找的内容。

另请注意,如果您正在处理一个大文件,则不要将整个文件存储在内存中。 (既然如此,为什么不使用合适的数据库呢?)


0
投票

直接的问题是

read()
将文件中的 all 剩余数据读入内存;然后您就不能再从同一个文件句柄中使用
read()
readline()
,因为它已经位于文件末尾。

您可以遍历内存中的整个列表,并使用

readlines()
打印匹配的条目之后的条目,它类似地读取整个文件,但可以方便地将行作为字符串列表返回。

    ...
    carlist = cars.readlines()
    for car in range(0, len(carlist), 2):
        if check in carlist[car]:
            print(carlist[car+1])

但是,为了避免将大量文本读入内存并立即丢弃它,也许一次只读取一行,并在找到匹配项后立即停止。

check = input("Enter full name of car: ")
found = False
with open('cars.txt', 'r') as cars:
    car_line = 1
    for line in cars:
        if car_line:
            if check in line:
                found = True
        else:
            if found:
                print(line, end="")
                break
        car_line = 1 - car_line

如果您以前没有见过这样的代码,那么您需要花点时间思考一下。基本上,我们一次检查一行,并保留几个状态变量来跟踪我们在前几行中所做的事情。

  • car_line
    跟踪这是奇数行(新记录的开始,即有关新车的信息)还是偶数行(意味着它属于前一辆车行)
  • found
    跟踪我们是否找到了我们正在寻找的汽车。

所以,读一行。如果这不是我们要找的车,只需更新

car_line
来提醒我们刚刚做了什么。然后再读一行。这不是
car_line
,所以我们采用
else
,它也不是
found
,所以我们不对其执行任何操作。再次阅读下一行。重复直到车线匹配。此时设置
found
提醒我们打印下一行后退出。最后,当您阅读下一行时,您会发现它不是汽车线,并且现在找到了我们需要的信息,因此打印并退出。

分配

car_line = 1 - car_line
实现了切换。如果
car_line
为 1,则新值为 0;如果它是 0,则新值将为 1。(这可以很好地推广到在两个任意状态之间切换。)

一个更好的解决方案是将数据重写为适当的机器可读格式,例如 CSV 或 JSON,或者可能是 SQLite 数据库,然后从那里获取数据。

上面的逻辑也可以用于此目的,只需进行相当小的修改。这是一个 CSV 转换器。

with open('cars.txt', 'r') as cars, open('cars.csv', 'w') as outfile: car_line = 1 writer = csv.writer(outfile) car = [] for line in cars: data = line.rstrip('\n') if car_line: car = [data] else: car.append(float(data)) writer.writerow(car) car_line = 1 - car_line
搜索生成的 CSV 文件会更加直接和方便。如果您需要多次操作数据,可以将其保存在数据库中,并为您要搜索的字段建立索引。

© www.soinside.com 2019 - 2024. All rights reserved.