1

我目前正在努力处理 python 中的文件 IO 并分配给一个类。我有一个包含多行的 csv 文件,我需要随机选择其中一行并将其分配给我已经定义的类。例如:

.csv 文件:

weapon.csv
sword1,5,1,sharp
sword2,10,2,very sharp

class Weapon:
    def __init__ (self, name, value, weight, description):
        self.name = name
        self.value = value
        self.weight = weight
        self.description = description

由此,我想得到一个武器,其 csv 中的行中的值与它们在 init 部分中的写入方式相匹配,因此如果从 csv 中随机选择第 1 行,Weapon.name = Sword1,Weapon .value = 5,Weapon.weight = 1,Weapon.description = 锋利

关于如何做到这一点的任何帮助都会很棒,因为我正在努力理解 python 中的文件 I/O。谢谢!

4

2 回答 2

3

像这样的东西?

import random
import csv

class Weapon: 
    def __init__ (self, name, value, weight, description):
        self.name = name
        self.value = value
        self.weight = weight
        self.description = description      

with open('weapon.csv', 'r') as csvfile:
  weaponscsv = list(csv.reader(csvfile))    

lengthofcsv = len(weaponscsv)
position = random.randrange(0, lengthofcsv)

aweapon = Weapon(*weaponscsv[position])

print aweapon.name
print aweapon.value
print aweapon.weight
print aweapon.description
于 2013-05-24T11:23:12.000 回答
0

首先,您应该将文本值保存在用引号括起来的 csv 中。这将允许您使用 eval 来处理每个 int、str 等。

csv 文件: "sword1",5,1,"sharp" "sword2",10,2,"very sharp"

假设武器.csv 中有 N(预定)行

from random import randint

rand_index = randint(0, N - 1)

with open('weapon.csv') as f:
    for j, row in enumerate(f):
        if j == i:
            my_row = row.split(',')
processed_row = [eval(x) for x in my_row]
weapon = Weapon(*processed_row)

将武器加载在内存中会更好,因为一遍又一遍地读取文件的成本会很高。更好的方法是

from random import sample

def get_random_weapon(L):
    row = sample(L, 1)
    return Weapon(*row)

with open('weapon.csv') as f:
    weapon_list = [[eval(x) for x in row.split(',')] for row in f]

weapon = get_random_weapon(weapon_list)
于 2013-05-24T11:27:49.967 回答