python中的文件是空的无缘无故

时间:2013-08-07 20:10:59

标签: python list python-2.7 file-io pygame

我试图将我的世界一代从我的实际游戏中分离出来,因为我通常会失败。但由于某种原因,它一直坚持文件是空的/从它获得的变量是空的,有时,当我看后,实际的程序文件已经清空了文本文件的所有信息,有时不是。这是代码:

Dropbox Main code

Dropbox World gen

以下是主代码中文件处理的一小部分摘录:

world_file = open("C:\Users\Ben\Documents\Python Files\PlatformerGame Files\World.txt", "r")
world_file_contents = world_file.read()
world_file.close()
world_file_contents = world_file_contents.split("\n")
WORLD = []
for data in world_file_contents:
    usable_data = data.split(":")
    WORLD.append(Tile(usable_data[0],usable_data[1]))

瓦片类:

class Tile():
    def __init__(self,location,surface):
        self.location = location
        self.surface = surface

错误:

Traceback (most recent call last):
  File "C:\Users\Ben\Documents\Python Files\PlatformerGame", line 89, in <module>
    Game.__main__()
  File "C:\Users\Ben\Documents\Python Files\PlatformerGame", line 42, in __main__
    WORLD.append(Tile(usable_data[0],usable_data[1]))
IndexError: list index out of range

很抱歉,如果这很明显。我也在使用pygame。

1 个答案:

答案 0 :(得分:2)

输入文件中可能有空行;你想跳过这些。

您还可以简化平铺阅读代码:

with open("C:\Users\Ben\Documents\Python Files\PlatformerGame Files\World.txt", "r") as world_file:
    WORLD = [Tile(*line.strip().split(":", 1)) for line in world_file if ':' in line]

如果行中有:个字符,则仅处理行,仅拆分一次,并在一个循环中创建WORLD列表。

至于使用os.startfile():您正在后台启动另一个脚本。然后,该脚本会在生成新数据之前打开要写入的文件并明确清空该文件。 同时您正试图从该文件中读取。有可能你最终在那时读取一个空文件,因为另一个进程尚未完成生成和写入数据,并且当文件写入被缓冲时你将看不到 all 数据,直到其他进程关闭文件并退出。

此处不要使用os.startfile() 。改为导入其他文件; 导入时,代码将在中执行,保证文件关闭。