TLDR;写入文件导致稍后阅读高飞文件。
我正在尝试在文件中创建一个数字网格,然后再将其调回。
这是我的代码:
data = []
if os.path.isfile("./" + fname):
with open(fname, "r") as f:
for line in f:
data.append(line.split(","))
else:
f = open(fname,"w+")
for i in range(3):
f.write("0,0,0")
data.append(["0","0","0"])
f.close()
print(data)
简单地说,上面的代码检查是否存在名为fname
的文件。如果没有,它会创建一个新文件,否则,它会将值的“网格”存储为data
。
正如所料,当我第一次运行它时,它会打印[["0","0","0"],["0","0","0"],["0","0","0"]]
,并创建一个新文件XXXXXXXX.txt
。出了什么问题,当你再次运行它时会打印[['0', '0', '00', '0', '00', '0', '0']]
,这是错误的。检查文件后,存储的信息为0,0,00,0,00,0,0
,不是:
0,0,0
0,0,0
0,0,0
如果我使用f.write("0,0,0\n")
,文件看起来很好,但程序打印[['0', '0', '0\n'], ['0', '0', '0\n'], ['0', '0', '0']]
,这仍然是错误的。
我很困惑,请帮忙。
答案 0 :(得分:1)
要将行写入文件,请使用:
f.write("0,0,0\n")
从文件中读取时,删除新行char:
data.append(line.rstrip('\n').split(","))
答案 1 :(得分:0)
这个
for line in f:
不会删除行尾的'\n'
=>在阅读和拆分时,您的上一个0
仍会保留'\n'
。
此
f.write("0,0,0")
不会自动挂载'\n'
=>如果您继续写入文件,则会直接放在0
之后,导致0,0,00,0,00,0,0
。
<强>修正:强>
(包括一些代码使它成为一个mvce并修复f = opne(...)
这是坏事:
import os
fname = "test.txt"
data = []
if os.path.isfile("./" + fname):
with open(fname, "r") as f:
for line in f:
data.append(line.rstrip('\n').split(",")) # strip '\n'
else:
with open(fname,"w+") as f: # do not use f = open(fname,"w+") - it will not auto-
# magically close your filehandle if errors get thrown
for i in range(3):
f.write("0,0,0\n") # add '\n'
data.append(["0","0","0"])
print(data)
答案 2 :(得分:-1)
我觉得你的问题更多的是关于data
错误打印(或者不打印你想要它的方式)。原因是\n
列表中的data
未显示您希望的结果,因为您并未直接打印该索引(__str__
和{{ 1}}不同,但你可以看到以后)。因此,您必须单独访问每个索引而不是整个列表,这可以使用__repr__
循环来完成。
for
如果你试试这个,你可以看到,这也行不通。这是因为for layer1 in data:
print(layer1)
列表由更多列表组成,而不是字符串。如果您要使用data
的字符串替换每个列表,它将起作用。但是你希望列表中有列表。有点让人想起嵌套的东西吧?那么你可以使用嵌套 \n
循环(得到它......因为列表会提醒你嵌套的东西,并且嵌套了循环......是的好)。所以你要做的就是创建另一个for循环。
for
这将打印0并在需要时创建新行。但是,它会在没有任何逗号的情况下执行此操作,为您提供如下输出:
for layer1 in data:
for layer2 in layer1: # not for layer2 ib data
print(layer2)
您可以通过在附加到000
000
000
的实际字符串中包含逗号来解决此问题。
我希望这有帮助!