我正在努力理解類/物件并與它們一起使用 csv。
我有一個 26 行的 CSV,1 是標題,另一個包含資訊行。下面的小例子
id,food,food_print,cal1,cal2,expi1999,expi2000,expi2001
1,bun,bun_bun,45.3434,199.32323,23.3333,45.4444,33.33333
2,burger,burger_bun,45.342343,200.34243,34.3333,0,9
3,pickle,pickle_seed,67.345454,34.3434,34,56,33
4,chicken,chicken_egg,44.34343,43.343343,43,434,34343
我的班級如下:
class City(object):
def __init__(self, food = 'n/a', foodprint = 'n/a', cal1 = -999, cal2 = -999,
expi1999 = -999, expi2000 = -999, expi2001 = -999)
self.food = food
self.foodprint = foodprint
self.cal1 = cal1
self.cal2 = cal2
self.expi1999 = expi1999
self.expi2000 = expi2000
self.expi2001 = expi2001
meals = []
foodfile = open('Food.csv', 'rt')
headers = foodfile.readline().strip().split(',')
headers = headers.split(',')
for line in foodfile:
foodfields = foodfile.readline().strip().split(',')
如何將我的食物 csv 中的行寫入要在類中參考的物件?
uj5u.com熱心網友回復:
假設所有列都填充在每一行中:嘗試:
for line in foodfile:
foodfields = foodfile.readline().strip().split(',')
meals.append(City(foodfields[1],foodfields[2],foodfields[3],foodfields[4],foodfields[5],foodfields[6],foodfields[7]))
uj5u.com熱心網友回復:
真實語氣避免動態類。
因為你的代碼在未來的變化中變得不可預測。請改用資料類。
此外,此行為允許您在與任何可呼叫的資料交換期間將此“資料模型”稱為注釋。
from dataclasses import dataclass
@dataclass
class City:
food: str = 'n/a'
foodprint: str = 'n/a'
cal1: int = -999
cal2: int = -999
expi1999: int = -999
expi2000: int = -999
expi2001: int = -999
但是如果你現在想怎么做 -setattr函式存在于全域命名空間中。
class DynamicContainer:
@classmethod
def create(cls, headers: list[str], data: list[str]):
obj = cls()
for header, value in zip(headers, data):
setattr(obj, header, value)
return obj
headers = 'id,food,food_print,cal1,cal2,expi1999,expi2000,expi2001'.split(',')
data = '1,bun,bun_bun,45.3434,199.32323,23.3333,45.4444,33.33333'.split(',')
cont = DynamicContainer.create(headers, data)
print(cont.id, cont.cal1, cont.expi2000)
uj5u.com熱心網友回復:
這是我的做法:
import csv
class City(object):
def __init__(self, food=None, foodprint=None, cal1=None, cal2=None, expi1999=None, expi2000=None, expi2001=None):
self.food = food
self.foodprint = foodprint
self.cal1 = float(cal1)
self.cal2 = float(cal2)
self.expi1999 = float(expi1999)
self.expi2000 = float(expi2000)
self.expi2001 = float(expi2001)
def __repr__(self):
return (
f"{self.__class__.__name__}("
f"food={self.food!r}"
f", "
f"food_print={self.foodprint!r}"
f", "
f"cal1={self.cal1!r}"
f", "
f"cal2={self.cal2!r}"
f", "
f"expi1999={self.expi1999!r}"
f", "
f"expi2000={self.expi2000!r}"
f", "
f"expi2001={self.expi2001!r}"
f")"
)
with open("Food.csv") as stream:
next(stream) # Skip the header row
reader = csv.reader(stream)
meals = [City(*row[1:]) for row in reader]
這是rows看起來的樣子:
[City(food='bun', food_print='bun_bun', cal1=45.3434, cal2=199.32323, expi1999=23.3333, expi2000=45.4444, expi2001=33.33333),
City(food='burger', food_print='burger_bun', cal1=45.342343, cal2=200.34243, expi1999=34.3333, expi2000=0.0, expi2001=9.0),
City(food='pickle', food_print='pickle_seed', cal1=67.345454, cal2=34.3434, expi1999=34.0, expi2000=56.0, expi2001=33.0),
City(food='chicken', food_print='chicken_egg', cal1=44.34343, cal2=43.343343, expi1999=43.0, expi2000=434.0, expi2001=34343.0)]
筆記
- 作用是顯示類物件的
repr內容,可以忽略 - 我使用該
csv模塊來簡化 CSV 資料的決議 - 我還將這些值轉換為浮點數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/520939.html
標籤:PythonCSV
