1

私は現在、Python でのファイル IO とクラスへの割り当てに苦労しています。複数の行を含む csv ファイルがあり、それらの行の 1 つをランダムに選択して、既に定義したクラスに割り当てる必要があります。例えば:

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 セクションに記述されている方法と一致する武器になりたいので、行 1 が csv からランダムに選択された場合、 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,"verysharp"

Weapons.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 に答える