【问题标题】:Appending new lines to a text file, and then retrieving them later Python 3将新行附加到文本文件,然后在以后检索它们 Python 3
【发布时间】:2018-04-16 05:05:28
【问题描述】:

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

我很困惑,请帮忙。

【问题讨论】:

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


    【解决方案1】:

    要将行写入文件,请使用:

    f.write("0,0,0\n")
    

    从文件中读取时,删除新行字符:

    data.append(line.rstrip('\n').split(","))
    

    【讨论】:

      【解决方案2】:

      这个

      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) 
      

      【讨论】:

      • 你能告诉我为什么 f.write(str) 不会像online examples 中所说的那样自动将 str 参数添加到新行吗?
      • @TheEye 在检查了在 3.6 和 2.7 中写入文件时是否存在差异后,我会将其归咎于糟糕的教程——它们在很多方面都有差异。我主要使用 3.6,您需要自己应用 \n 。根据 pyfiddle.io,2.7 和 2.6 的行为相同 - 没有换行符。
      【解决方案3】:

      我感觉您的问题更多是关于 data 错误打印(或未按您希望的方式打印)。您的data 列表中的\n 未按您想要的方式显示的原因是因为您没有直接打印该索引(__str____repr__ 的不同之处,但稍后您可以看到) .因此,您必须单独访问每个索引而不是整个列表,这可以通过 for 循环来完成。

      for layer1 in data:
          print(layer1)
      

      如果你试试这个,你会发现,这也行不通。这是因为data 列表由更多列表组成,而不是字符串。如果您要用带有\n 的字符串替换每个列表,它会起作用。但是您想在列表中包含列表。有点让你想起嵌套的东西,对吧?好吧,您可以使用 nested for 循环(得到它...因为列表提醒您嵌套的东西,并且有嵌套的 for 循环...是的,好的)。所以你所做的只是创建另一个 for 循环。

      for layer1 in data:
          for layer2 in layer1: # not for layer2 ib data
              print(layer2)
      

      这将打印 0 并在需要的地方创建新行。但是,它会在没有任何逗号的情况下执行此操作,从而为您提供如下输出:

      000
      000
      000
      

      您可以通过在附加到data 的实际字符串中包含逗号来解决此问题。

      我希望这会有所帮助!

      【讨论】:

      • 不要“感知”——阅读问题。它是关于“检查文件,存储的信息是 0,0,00,0,00,0,0,NOT:0,0,0\n0,0,0\n0,0,0\n”(如以及打印不正确)-后者是前者的结果。
      猜你喜欢
      • 2014-09-03
      • 1970-01-01
      • 1970-01-01
      • 2018-12-30
      • 2016-05-26
      • 2022-10-15
      • 2013-12-26
      • 2021-12-11
      • 1970-01-01
      相关资源
      最近更新 更多