读取和写入文本文件会添加无效字符

时间:2018-05-25 21:43:51

标签: python python-3.x file file-io

继续阅读,解析数据,然后将新数据覆盖到文本文件中。我的问题是,在添加我想要的内容之前,写入文件会在开头添加无效字符。我得到的错误是:

ValueError: could not convert string to float: '\x00\x0045.5'

45.5, 5.0是我尝试写入文件的数据,每个\x00表示在写入文件进程期间添加的无效字符。通常每次迭代都会添加10-15个。我可以手动进入文本文件并删除它们,但有什么好玩的呢?

这是我的代码,try / except是我为解决问题而添加的内容 -

def __init__(self, power):
    self.name = "Dr. Strange"
    self.CloakOfLevitation = "I like Dr. Strange"
    self.EyeOfAgamotto = InfinityStones.TimeStone(5000 + power, self.name)
    self.win = False
    self.length = randint(2, 100)

    stats = open("Stats.txt", 'r+', encoding = 'utf-8')
    data = stats.read()

    try:
        avg, tries = data.split(sep = ',')
        avg = float(avg)
        tries = float(tries)
    except ValueError:
        stats.truncate(0)
        stats.write(data[1:])
        sleep(5)
        stats.close()
        self.__init__(power)

    self.new_avg = avg + (self.length - avg) / tries
    stats.truncate(0)
    stats.write(str(self.new_avg) + ',' + str((tries + 1)))
    stats.close()

此代码的大部分涉及递归,self.length确定递归将持续多长时间,power只是一个数字,对此部分并不重要。 sleep(5)在那里,所以我可以在程序运行之前停止程序,然后它会炸毁我的计算机。每次将数据写入文件时,它都会添加无效字符(在错误输出中表示为\x00)。 avg应该是递归之前的平均“死亡数”,tries是程序运行的次数。

try/except块的想法是尝试将文件中的数据转换为整数,以便可以使用它们进行数学运算,如果它无法将其转换为字符,请尝试删除第一个文本文件中的字符(可能是无效字符),然后再试一次(重新运行__init__)。目前它只是有点爆炸。

我看到有关编码的内容,并尝试过,但它没有改变任何东西。仍在添加无效字符。我有truncate(0)擦除文件,以便我覆盖文件而不是附加数据。

1 个答案:

答案 0 :(得分:2)

我认为你需要在截断时随时退回文件。因此,您可以在stats.truncate(0)之后添加stats.seek(0)