将新行附加到文本文件,然后在Python 3中检索它们

时间:2018-04-16 05:05:29

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

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']],这仍然是错误的。

我很困惑,请帮忙。

3 个答案:

答案 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 的实际字符串中包含逗号来解决此问题。

我希望这有帮助!