Python - 文件在语句中关闭

时间:2013-10-02 02:55:44

标签: python

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

版本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()方法之后自动关闭?

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

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

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