我正在尝试为电动汽车司机制作一个应用程序,我正在使用一个文本文件来存储数据,它的工作方式是我有电动汽车的名称,名称下的行包含它可以获得的英里数每 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)
这就是我所拥有的,但每次它找到汽车时都找不到它后面的范围。
我建议将文件读入字典,然后使用该字典查找汽车,例如:
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
您可以执行以下操作:
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
是一个消耗性迭代器。您对其进行迭代,直到找到您的汽车,然后该迭代器中的下一个项目就是您要查找的内容。
另请注意,如果您正在处理一个大文件,则不要将整个文件存储在内存中。 (既然如此,为什么不使用合适的数据库呢?)
直接的问题是
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 文件会更加直接和方便。如果您需要多次操作数据,可以将其保存在数据库中,并为您要搜索的字段建立索引。