python: create and save in a class? get that data from that class. search and maybe filter in that class?

Viewed 36

im fairly new to python, to set the expectations.

I prepared examples to show what i did and then what i want to do.

example_class

class Vehicle:
    
    def __init__(self,wheels,hp,type):
        self.wheels = wheels    # number of wheels
        self.hp     = hp        # horsepower
        self.type   = type      # type of vehicle

example_main

from example_class import Vehicle as VH

veh1 = VH(4,100,'car')
veh2 = VH(2,70,'motorbike')

that does work in regards that i can create veh-objects (its called objects then, right?)

so, what i wanna achieve here is that i have that data of those vehicles already in that example_class, or at least that i have it stored in something like that. how i understood it, the class is good to create my own kind of data structure. So it should not be the same "space" where i save that data, nor where i can call it from. so i think that would be wrong:

example2_class

class Vehicle:
    
    def __init__(self,wheels,hp,type):
        self.wheels = wheels    # number of wheels
        self.hp     = hp        # horsepower
        self.type   = type      # type of vehicle
        
    def vroomvroom(self):
        veh1 = VH(4,100,'car')
        veh2 = VH(2,70,'motorbike')

if that is correct, then i got confused how i do access it. and referring to the topic, would i be able to search and filter within there? i did watch a few tutorials and such, but .... its hard to get a grip on all that stuff and what do i actually need for the stuff i want to do is a little beyond me. i am not sure if a decorator would be the solution, because that concept is beyond me right now. Sorry in advance for such a lowly question :/

edit: i should note, that my first idea was to save, store and load data in exel files using for example openpyxl. but than i thougt when i establish a data-structure it could be easier?

edit 2: at the end i wanted to access the data something like this.

veh = vehicle(2).hp # which would be 70

i come from matlab, hence the "(2)", which i wanted to indicate that i wanted to access the 2nd dataset/row and from that the hp-value

edit 3: i shall limit it to a specific problem, but they are conncted. if i cant do it in a class, then the question regarding the class are redundant. i could make seperate posts, but then it can happen that the answer in one, make the other questions useless. am i doing it wrong ?

1 Answers

I'm not quite clear what you're asking, but I think you're have a list of Vehicle you want to save to a file, read it back, and search it. I have two suggestions:

  • Python's standard library contains pickle, which can seralize objects. Here's a decent-looking tutorial. Then you can load all of them back into memory and filter with Python code:
import pickle
import typing

# Create
class Vehicle(typing.NamedTuple):
    wheels: int
    hp: int
    type_: str


vehicles_to_save = [
    Vehicle(wheels=4, hp=100, type_="car"),
    Vehicle(wheels=2, hp=70, type_="motorbike"),
]

# Save
filepath = "saved_vehicles.pickle"

with open(filepath, "wb") as fp:
    pickle.dump(vehicles_to_save, fp)

# Load
with open(filepath, "rb") as fp:
    loaded_vehicles = pickle.load(fp)

# Filter
bikes = [v for v in loaded_vehicles if v.type_ == "motorbike"]
print(bikes)  # [Vehicle(wheels=2, hp=70, type_='motorbike')]
  • You might also consider using the built-in sqlite library if you want to use the SQL query language to save, load, and filter your Vehicles. SQL can be a pain to use, so consider using a wrapper library, such as peewee or sqlalchemy.

  • If you want to edit these in a spreadsheet, I recommend using the csv module. You can open and edit the csv file in Excel. Here's an example similar to the pickle one, using basic classes:

import csv


class Vehicle:
    def __init__(self, wheels, hp, type_):
        self.wheels = wheels
        self.hp = hp
        self.type_ = type_

    # Make it possible to print(v)
    def __repr__(self):
        return f"Vehicle(wheels={self.wheels!r}, hp={self.hp!r}, type_={self.type_!r})"


def vehicle_to_csv_row(v):
    return (v.wheels, v.hp, v.type_)


def vehicle_from_csv_row(row):
    return Vehicle(row[0], row[1], row[2])


vehicles_to_save = [
    Vehicle(wheels=4, hp=100, type_="car"),
    Vehicle(wheels=2, hp=70, type_="motorbike"),
]

filepath = "saved_vehicles.csv"

with open(filepath, "w", newline="") as fp:
    writer = csv.writer(fp)
    for v in vehicles_to_save:
        writer.writerow(vehicle_to_csv_row(v))


loaded_vehicles = []

with open(filepath, newline="") as fp:
    reader = csv.reader(fp)
    for row in reader:
        loaded_vehicles.append(vehicle_from_csv_row(row))

print(loaded_vehicles)
Related