【问题标题】:Reading and writing to text file adds invalid characters读取和写入文本文件会添加无效字符
【发布时间】:2018-11-05 07:50:20
【问题描述】:

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

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)tries 大概是多次尝试;因此,它必须是int,而不是float。 (2) 重写文件内容的一种更简洁的方法是从文件中读取,关闭它,然后打开写入,然后写入。
  • 另外,从__init__ 内部递归调用__init__ 非常奇怪。如果要循环直到成功,请使用while 循环,不要使用递归模拟循环。请注意,通过递归调用,当您最终成功时,您将拥有一整套函数,它们对同一个磁盘文件都有单独的句柄,并且都尝试truncate、write 和@987654342 @他们的文件,我无法想象这是一件好事。另外,这将包括已经closed 文件的那些…

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


【解决方案1】:

我认为您需要在进行截断时退回到文件中。所以你在stats.truncate(0) 之后添加stats.seek(0)

【讨论】:

  • 谢谢!这行得通,但为什么有必要呢?此时文件中没有字符,因此当前位置不应该在文件的开头吗?
  • @elkshadow5 文档说“当前文件位置没有改变”这就是让我看到你需要手动寻找的线索。我不完全确定为什么它不是操作的一部分,但肯定有一些用例。
猜你喜欢
  • 2014-07-28
  • 2012-01-17
  • 2016-10-06
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
  • 2016-02-12
相关资源
最近更新 更多