0

我有两个版本的类似代码,一个有效,另一个无效:

版本 1

  #some code
with open('file', 'w') as f:
        f.writelines(new_lines)

with open('file') as f:
        i = 0
        for line in f:
           i = i + 1
           if i != 5 and i != 18 and i != 27:
              row.append(line)

第 2 版

   # some code
with open('file', 'w') as f:
        f.writelines(new_lines)
        i = 0
        for line in f:
           i = i + 1
           if i != 5 and i != 18 and i != 27:
              row.append(line)

执行版本 2 代码时,我收到一条错误消息,指出文件未打开。我很困惑,因为显然代码仍在with语句中。在 f.writelines() 方法之后文件是否会自动关闭?

4

2 回答 2

2

您遇到的问题与您用来打开文件的模式有关。在第一个示例中,您首先打开它以使用"w"模式进行写入。然后你关闭它并以默认"r"模式重新打开它。这有所作为!

首先,您不能读取以常规"w"模式打开的文件。您可以使用"w+"允许读取和写入,或者"r+"如果您不希望它在打开文件后立即截断文件。

另一个问题是您在文件中的位置。当您将数据写入文件时,您将在文件数据的末尾结束,因此仅从那里读取它不会得到任何东西。您将需要调用f.seek(0)以返回文件的开头,以便再次阅读。

但是,写文件然后读回你刚刚写的行有点傻(除非涉及其他复杂的逻辑)。我建议改为使用for line in f循环for line in new_lines,这样可以避免不必要地读取文件。

于 2013-10-02T03:02:58.603 回答
1

您在文件处于写入模式时对其进行迭代。将其更改为with open('file', 'r+') as f:

之后f.writelines(new_lines),您还需要回到文件的开头以遍历每一行。f.seek(0)在循环之前放入

于 2013-10-02T02:59:28.430 回答