【问题标题】:How can I change the specific word from the text file using loops and if statements?如何使用循环和 if 语句更改文本文件中的特定单词?
【发布时间】:2021-12-19 21:50:58
【问题描述】:

我正在为我的第一个 python 课程做一个简单的项目,但我被困在一个部分,我不知道如何继续。

所以在这部分用户应该输入他/她想要租用的车辆ID。输入车辆 ID 后,我的代码开始在 Vehicle.txt 文本文件中搜索该车辆 ID。如果代码找到 VehicleID 变量并且还发现它是 "A"(表示可用),它会开始打印该特定汽车的详细信息。

我的 Vehicle.txt 文本文件如下所示;

XJY-604,Hyundai Getz,O,0,45.00,A
AJB-123,BMW mini,P,200,65.00,A
WYN-482,Ford Fiesta,O,0,40,A
BKV-943,Ford Ikon,P,150,60,A
JMB-535,Ford Flex,O,0,50,A
FKI-232,Fiat Egea,O,0,30,A
KLE-154,Toyota Corolla,O,0,40,A
ITO-444,Renault Clio,O,0,55,A
MAA-321,Honda Civic,O,0,70,A
IRK-948,Hyundai i20,O,0,30,A
TRY-475,Peugeot 2008,O,0,50,A
IBM-984,Skoda Superb,O,0,60,A
KRI-365,Opel Corsa,O,0,50,A
PMA-760,Citreon C3,O,0,55,A
NGT-407,KIA Sportage,O,0,60,A

所以到目前为止,一切都很好;如果代码找到车辆 ID(以及条件 “A”),则代码开始按我的意愿打印详细信息(如果条件不同或未找到车辆 ID,它还会打印适当的错误消息这也可以按照我的意愿完美运行)。

我的问题在这部分之后开始:

打印汽车的详细信息后,我的代码应将特定汽车的状况从 "A"(可用)更改为strong>Vehicle.txt 文本文件。

例如,假设用户输入了车辆 ID TRY-475 --> 在此输入之后,我在 Vehicle.txt 文本文件中的异常更改是;

excepted change

但文本文件的实际变化是;

actual change

我的代码是这样的;

from datetime import datetime
now = datetime.now()
dateandtime = now.strftime("%d/%m/%Y %H:%M:%S")

def rentVehicle():
    VehicleID = input("Please enter the vehicle ID you want to rent: ")
    with open("Vehicle.txt","r+") as f1:
        for line in f1:
            l = line.split(",")
            if l[0] == VehicleID and l[5] == "A\n" or l[5] == "A":
                renterID = input("Please enter your ID: ")
                startingodometer = input("Please enter the current odometer reading: ")
                print("\nCar",l[0],"is rented to", renterID,"\n")
                print("\t\t******************** Vehicle Details ********************\n")
                print("Vehicle ID =",l[0],"\t\tDescription =",l[1],"\t\tDaily Rate =",l[4],"\tStatus =",l[5],"\n")
                print("Renter ID =",renterID,"\tDate/time of rent =",dateandtime,"\tRent Starting Odometer =",startingodometer)
                f1.write(l[5].replace(l[5],"R\n"))
                print("\nRenting vehicle is successful!")
                break
             elif l[0] == VehicleID and l[5] == "R\n" or l[5] == "R":
                print("\nThe vehicle you entered is rented. Please display available cars from the main menu.")
                break
        else:
            print("\nThe vehicle ID you entered does not exist. Please enter a valid vehicle ID.")
            break
rentVehicle()

我认为问题出在第 17 行 (f1.write(l[5].replace(l[5],"R\n")))。我搜索了其他选项,但它们也没有在 Vehicle.txt 文本文件中给出我的例外输出。此外,我不允许更改我的文件名或将这些行添加到另一个文件(手动或在代码中),因为它在我的项目工作中受到限制。我应该只通过代码更新当前的 Vehicle.txt。如果有人解决这个问题,我会很高兴。对于初学者来说,这些问题有时真的很有挑战性。提前致谢。

【问题讨论】:

    标签: python loops if-statement replace


    【解决方案1】:

    您的代码中的问题在这里:

    with open("Vehicle.txt","r+") as f1:
        for line in f1:
            l = line.split(",")
            if l[0] == VehicleID and l[5] == "A\n" or l[5] == "A":
                renterID = input("Please enter your ID: ")
                startingodometer = input("Please enter the current odometer reading: ")
        ~~~~~~~~~~~~~~~~~~~
                f1.write(l[5].replace(l[5],"R\n"))
        ~~~~~~~~~~~~~~~~~~~
                break
            elif l[0] == VehicleID and l[5] == "R\n" or l[5] == "R":
                print("\nThe vehicle you entered is rented. Please display available cars from the main menu.")
                break
        else:
            print("nothing found")
            break
    

    我想你不是很熟悉后台文件读取是如何工作的......简单地说,有一个特定长度的缓冲区(例如1028B),这意味着它将阅读1028B 的文字。之所以会这样,是因为你无法有效地知道行长有多长,而且从文件中读取也很慢,因此在最短的时间内尽可能多地读取是每个人的目标。

    现在到您的代码,发生的事情是您的整个文件被加载到提到的缓冲区中,并且文件指针最终出现在文件末尾。

    您应该做并且建议您做的是不要重写您当前正在阅读的文件(您可以查看一些有关文件实际工作方式的文章,抱歉,我现在不能 100% 确定它是否能让您写入您正在阅读的文件...)。

    所以,你需要做的,是这个(这是伪代码,为了让你自己做,获得更多经验:)):

    with open("Vehicle.txt","r+") as read_file:
        with open("Vehicle2.txt","w+") as write_file:
            for line in read_file:
                if (your checks):
                    ... (setting up)
                    write_file.write(f"{l[0]},{l[1]},{l[2]},{l[3]},{l[4]},{edited_thing}")
                else:
                    write_file.write(line)
    
    // after this, you can eighter rename these files or delete the original one and then rename the other one ther:
    // vehicle.txt -> temp.txt ; Vehicle2.txt => Vehicle.txt ; delete temp.txt ?
    

    我希望这个答案对您有所帮助,并祝您有一个愉快的编程之旅;)

    编辑:

    我刚刚注意到您那里有多个支票。如果您真的不需要破坏它,我建议您使用continue,它将立即开始下一次迭代。

    【讨论】:

    • 如果您有任何问题,请随时提问 :) 我很乐意回答(如果我知道答案的话 :D)
    • 嘿@StyleZ,谢谢你回答我!我尝试按照您向我展示的那样更改我的代码,但是在执行 write_file.write(f"{l[0]},{l[1]},{l[2]},{ 部分时出现语法错误l[3]},{l[4]},{edited_thing}”)。语法错误是 --> f-string 表达式部分不能包含反斜杠(这对我来说是一个全新的语法错误:0)。而且,我的代码应该只更新当前的 Vehicle.txt 而不是将详细信息写入另一个(我不允许手动更改文件名或添加新文件,因为它在我的项目工作中受到限制:/)。我应该只更新当前的 Vehicle.txt。
    • 嗨,您能否提供完整的错误消息(以及代码)。据我了解,您正在尝试将其手动添加到 f-string "\" 中,不幸的是这是不可能的。您可以做的是创建一个变量 back_slash = "\" 并将其添加到 f 字符串 f"{x} {back_slash} {y}" 中。我希望这是有道理的。同样不幸的是,在读取时无法写入文件,将整个文件读入变量并重写它是一种不好的做法(我希望你能明白为什么)。查看以下 2 个链接以获取有关文件的更多信息:
    • stackoverflow.com/questions/125703/how-to-modify-a-text-file stackoverflow.com/questions/14271216/… 和一个小建议。如果您遇到与您提到的类似的错误,请在询问之前尝试使用谷歌搜索。它会让你意识到,如何有效地谷歌:)
    • 嘿再次@StyleZ,在尝试了您的步骤后,我更正了我在上次尝试中的错误。它现在可以按照您的说明工作,但是现在如果我的条件不同,或者没有这样的 VehicleID,我将无法显示任何适当的消息(因为 else: write_file.write(line) 条件不允许我添加新的 if 条件)。此外,代码创建了一个我需要手动重命名的新文件。这不适合我的项目工作,因为它受到限制。我只需要通过代码更新当前的文本文件。从您的角度来看,我知道这是不可能的:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多