繁体   English   中英

在 Python 中将用户输入导出到 txt 文件时遇到问题

[英]Having trouble exporting user input to txt file in Python

长话短说,我一直在研究 Python 程序,我一直在尝试将用户在程序中输入的内容保存到 txt 文件中 - 我总体上在网上收到了一些帮助,但在这里有点难过.. 需要它包括已输入车辆的索引、制造商、model、颜色、年份和里程(基本上是当用户在主菜单中点击“4”时在 output 中可见的内容)。 这个想法是当用户点击“6”时,该列表/数据将被导出到名为“ Vehicle Inventory ”的txt文件中,然后退出应用程序。 问题肯定是在elif ch == 6 处的代码末尾: ......对此的任何帮助或解决方案将不胜感激:! 这是我到目前为止所拥有的:

# automobile class
class automobile:
    # constructor
    def __init__(self, make="", model="", color="", year=2018, mileage=0):
        self.make = make
        self.model = model
        self.color = color
        self.year = year
        self.mileage = mileage

    # setter methods
    def set_make(self, make):
        self.make = make

    def set_model(self, model):
        self.model = model

    def set_color(self, color):
        self.color = color

    def set_year(self, year):
        self.year = year

    def set_mileage(self, mileage):
        self.mileage = mileage

    # getter methods
    def get_make(self):
        return self.make

    def get_model(self):
        return self.model

    def get_color(self):
        return self.color

    def get_year(self):
        return self.year

    def get_mileage(self):
        return self.mileage


# end of automobile class
# method to add a new vehicle to the inventory
def add_vehicle(v_list):
    make = input("Enter make: ")
    model = input("Enter model: ")
    color = input("Enter color: ")
    year = int(input("Enter year: "))
    mileage = int(input("Enter mileage: "))
    v = automobile(make, model, color, year, mileage)
    v_list.append(v)
    print("*** VEHICLE ADDED SUCCESSFULLY...")


# method to remove a vehicle from the inventory
def remove_vehicle(v_list):
    index = int(input("Enter the index # of vehicle you would like to remove: "))
    if index >= 0 and index < len(v_list):
        make = v_list[index].get_make()
        model = v_list[index].get_model()
        v_list.pop(index)
        print(make, model, "HAS BEEN REMOVED FROM INVENTORY !")
    else:
        print("*** INVALID INDEX #... PLEASE TRY AGAIN")


# method to update a vehicle info in the inventory
def update_vehicle(v_list):
    index = int(input("Enter the index # of vehicle you would like to update: "))
    if index >= 0 and index < len(v_list):
        make = input("Enter new make: ")
        model = input("Enter new model: ")
        color = input("Enter new color: ")
        year = int(input("Enter new year: "))
        mileage = int(input("Enter new mileage: "))
        v_list[index].set_make(make)
        v_list[index].set_model(model)
        v_list[index].set_color(color)
        v_list[index].set_year(year)
        v_list[index].set_mileage(mileage)
        print("*** UPDATED SUCCESSFULLY !")
    else:
        print("*** INVALID INDEX #... PLEASE TRY AGAIN")


# method to print all vehicle details in proper formatted order
def display_vehicles(v_list):
    print('{:10} {:10} {:10} {:10} {:10} {:10}'.format('INDEX #', 'MAKE', 'MODEL', 'COLOR', 'YEAR', 'MILEAGE'))
    for i in range(len(v_list)):
        v = v_list[i]
        print('{:10} {:10} {:10} {:10} {:10} {:10}'.format(str(i), v.get_make(), v.get_model(), v.get_color(), str(v.get_year()), str(v.get_mileage())))


v_list = []  # initial list
# looping infinitely
while True:
    # showing menu
    print("1. Add a vehicle")
    print("2. Remove a vehicle")
    print("3. Update a vehicle")
    print("4. Display all vehicle inventory")
    print("5. Exit")
    print("6. Export to 'Vehicle Inventory' txt file and Exit")
    # getting choice
    ch = int(input("*** PLEASE CHOOSE AN OPTION: "))
    # performing actions based on choice
    if ch == 1:
        add_vehicle(v_list)
    elif ch == 2:
        remove_vehicle(v_list)
    elif ch == 3:
        update_vehicle(v_list)
    elif ch == 4:
        display_vehicles(v_list)
    elif ch == 5:
        break;
    elif ch == 6:
        with open('Vehicle Inventory.txt', 'w') as filehandle:
            for display_vehicles in v_list:
                filehandle.write("%s\n" % display_vehicles)
        break;
    else:
        print("*** INVALID OPTION... PLEASE TRY AGAIN")

执行您的代码,txt 文件包含诸如

<__main__.automobile object at 0x0000017F5E7017C0>.

问题是在 filehandle.write filehandle.write("%s\n" % display_vehicles)行将 object 引用作为要写入文件的数据传递。 据我所知,没有现成的 function 允许您传递文件 object 引用并从中自动提取数据。 如果你真的想使用 txt 文件,你可以这样做:

 with open('Vehicle Inventory.txt', 'w') as filehandle:
            for display_vehicles in v_list:
                filehandle.write("make: {}, model: {}, color: {}, year: {}, mileage:{} \n".format(display_vehicles.get_make(),display_vehicles.get_model(),display_vehicles.get_color(),display_vehicles.get_year(),display_vehicles.get_mileage()))

Output

make: car, model: a, color: red, year: 2020, mileage:20
make: car2, model: b, color: black, year: 10, mileage: 10 

格式的简要说明

格式允许您使用基于占位符的样式将值插入字符串。 {}对应于匿名占位符:这意味着 position 中的值取决于.format(value1, value2, ...)中使用的顺序。 或者,您可以使用命名占位符,例如:

"my car is {color} and i bought it in {year}".format(color= "red", year= 2010)


关于txt文件

就我个人而言,我不会使用 txt 文件,特别是因为在您只对几行或每行的某个值感兴趣(例如:所有红色汽车)的情况下,从这种类型的文件加载数据可能会非常烦人。 我不知道 txt 文件是否对您是强制性的,因此我不会提供有关以下替代方法的任何详细信息。 无论如何,您应该知道还有其他类型的文件被广泛用于存储信息。

  • Json 数据存储在字典中,即一组键值对。 借助 json模块,读写文件变得轻而易举
  • Csv 这与 txt 非常相似,但具有更结构化的形式,就好像它是一个表格一样。 每行对应一条记录,每条记录由列组成。 感谢pandas ,可以很容易地使用 csv 根据记录或行索引中包含的值提取数据子集。 文件结构还允许您快速创建图形并将数据导出到 Excel。
  • 泡菜 如果您甚至不关心人类友好的表示,而只想将数据永久保存到文件中,您可以尝试pickle

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM