2013-06-07 3 views
0

Итак, я создаю модуль python для создания и сохранения данных для игрового персонажа. класс является характер и идет следующим образом:Int() Преобразования не работают прямо в python

#!/usr/bin/python 
import os 
import re 

class Character: 
    storage = None 
    health = None 
    strength = None 
    xp = None 

    def __init__(self,stg): 
     os.chdir('/Users/alex/Desktop/Python/Support/Character') 
     storage = stg 
     f = open(storage) 
     #health index = 0 
     #strength index = 1 
     #xp index = 2 
     string = f.read() 
     finder = re.compile('/n') 
     stats = finder.split(string) 
     health = int(stats[0]) 
     strength = int(stats[1]) 
     xp = int(stats[2]) 
     f.close 

    def adjHealth(self,amount): 
     health += amount 

    def adjStrength(self,amount): 
     strength += amount 

    def adjXp(self,amount): 
     xp += amount 

    def save(self): 
     os.chdir('/Users/alex/Desktop/Python/Support/Character') 
     stats = [str(health),str(strength),str(xp)] 
     f = open(storage,'w') 
     f.writelines(stats) 

Всякий раз, когда я делаю эту команду из интерпретатора Python:

>>> import character as ch 
>>> ch.Character('jimmy') 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "/Users/alex/Desktop/Python/Modules/character.py", line 22, in __init__ 
health = int(stats[0]) 
ValueError: invalid literal for int() with base 10: '10\n10\n0\n' 

Он поставляется с этой ValueError. Должно быть разделение строки, возвращаемой f.read(), на ['10','10','0',''] справа?
Так почему я не могу преобразовать '10' в int? Я вроде как новичок в выражениях.

+1

Следующие две строки означают совершенно разные вещи: '\ n' и'/n'. –

+2

Не могли бы вы просто: 'stats = string.split ('\ n')' – karthikr

+0

@ Крис О ... боже, теперь я чувствую себя глупо. благодаря! – Awalrod

ответ

0

проблема с вашим регулярным выражением, но нет особой необходимости для регулярных выражений здесь - используя возможности, предоставляемые файловым объектам, все это (исправленной) код:

string = f.read() 
finder = re.compile('\n') 
stats = finder.split(string) 

может быть сведена к одна линия:

stats = f.readlines() 

Или, чтобы он без задней новой строкой:

f.read().splitlines() 

Кроме того, обратите внимание, что вы на самом деле не закрыть файл - вам нужно вызов близкий метод , не просто упомянуть об этом. Но предпочтительный способ сделать это with заявление:

with open(stg) as f: 
    stats = f.readlines() 

Это гарантирует, что файл будет закрыт, как только вы закончите с этим, даже если что-то пойдет не так, читая его.

Ваш код также имеет другую ошибку, которая будет кусать вас раньше, чем позже:

health = int(stats[0]) 

создает новый функция локальной переменной называется health - это не назначить его на тот, который вы установлен в None выше в классе корпус. You может установить это, назначив Character.health, но вы почти наверняка хотите self.health. Это укусит вас в ваших методах adj*, которые, как написано, приведут к ошибке.

Вы также в конечном итоге удаления эти переменные из тела класса - они делать не ведут себя как C++ или Java декларации атрибута (которые Python не требует или без метаклассом магии, даже поддержку) , и в конечном итоге не используются.

+0

Спасибо, но функция 'f.readlines()' возвращает значения с символом '\ n' в конце каждой строки в списке. Мне пришлось бы снимать символы новой строки. Но вы правы во всем остальном. Благодаря тонну. – Awalrod

+0

@Awalrod в этом случае вам все равно не нужно регулярное выражение - 'f.read(). Splitlines()'. – lvc

1

Это ваше регулярное выражение. Ниже будет искать буквенный символ / с последующим n:

finder = re.compile('/n') 

Это с другой стороны будет выглядеть для переноса строк:

finder = re.compile('\n')