【问题标题】:Int() Conversions not working right in pythonInt() 转换在 python 中不能正常工作
【发布时间】:2013-06-07 02:06:15
【问题描述】:

所以我正在制作一个 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 呢? 我对正则表达式有点陌生。

【问题讨论】:

  • 以下两个字符串的含义完全不同:\n/n
  • 你能不能只做:stats = string.split('\n')
  • @Chris 哦……天哪,我现在觉得自己很愚蠢。谢谢!

标签: python regex class python-2.5


【解决方案1】:

这是你的正则表达式。以下将查找文字字符/,后跟n

finder = re.compile('/n')

另一方面,这将寻找换行符:

finder = re.compile('\n')

【讨论】:

    【解决方案2】:

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

    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()
    

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

    你的代码还有另一个 bug,迟早会咬你:

    health = int(stats[0])
    

    创建一个名为 health 的新 function-local 变量 - 它不会将其分配给您在类主体中设置为 None 的变量。您可以通过分配给Character.health 来设置它,但您几乎肯定想要self.health。这会在您的 adj* 方法中对您不利,如所写,这将导致错误。

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

    【讨论】:

    • 谢谢,但f.readlines() 函数返回列表中每个字符串末尾带有\n 字符的值。我将不得不去掉换行符。但你对其他一切都是正确的。非常感谢。
    • @Awalrod 在这种情况下,你仍然不需要正则表达式 - f.read().splitlines()
    猜你喜欢
    • 1970-01-01
    • 2016-12-09
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 2020-05-20
    • 1970-01-01
    • 2017-08-13
    相关资源
    最近更新 更多