0

所以我正在制作一个 python 模块来为游戏中的角色创建和保存数据。该类是 Character ,如下所示:

#!/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 呢?我对正则表达式有点陌生。

4

2 回答 2

1

It's your regular expression. The following will look for the literal character / followed by n:

finder = re.compile('/n')

This on the other hand will look for newlines:

finder = re.compile('\n')
于 2013-06-07T02:10:00.697 回答
0

问题出在您的正则表达式上,但这里没有特别需要正则表达式 - 使用文件对象提供的功能,所有这些(更正的)代码:

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

可以简化为一行:

stats = f.readlines()

或者,没有尾随换行符:

f.read().splitlines()

另外,请注意您实际上并没有关闭文件 - 您需要调用close 方法,而不仅仅是提及它。但最好的方法是with声明:

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

这可确保文件在您完成后立即关闭,即使在读取时出现问题。

您的代码还有另一个错误,迟早会咬到您:

health = int(stats[0])

创建一个名为的新函数局部变量health- 它不会将其分配给您None在类主体中设置的变量。您可以通过分配 to 来设置它Character.health,但您几乎肯定想要self.health。这会在你的方法中咬你一口adj*,正如所写的那样,这将导致错误。

您最终还将从类主体中删除这些变量 - 它们的行为不像C++ 或 Java 属性声明(Python 不需要,或者,没有元类魔法,甚至支持),并且最终不会被使用。

于 2013-06-07T02:23:23.857 回答