0

是否可以将变量定义为open("file.txt", "a")并多次调用它,这样您就不必继续输入open("file.txt", "a")

我试过了,但它似乎对我不起作用。我不断收到错误消息:

ValueError:对已关闭文件的 I/O 操作。

我的代码如下所示:

x = open("test.txt", "a")
with x as xfile:
    xfile.write("hi")

#works fine until I try again later in the script

with x as yfile:
    yfile.write("hello")

问题:有没有办法做到这一点,我错过了?

(如果这个问题是重复的,我很抱歉,在我发布一个新问题之前,我确实搜索了谷歌和 SO。)

4

4 回答 4

3

如果您不想立即关闭文件,请不要使用with语句并在完成后自行关闭它。

outfile = open('test.txt', 'w')

outfile.write('hi\n')

x = 1
y = 2
z = x + y

outfile.write('hello\n')

outfile.close()

通常,with当您想要打开一个文件并立即对该文件执行某些操作然后关闭它时,您会使用该语句。

with open('test.txt', 'w') as xfile:
    do something with xfile

但是,如果可以的话,最好的做法是一次用一个文件处理所有 I/O。所以如果你想在一个文件中写几个东西,把这些东西放到一个列表中,然后写入列表的内容。

output = []

x = 1
y = 2
z = x + y
output.append(z)

a = 3
b = 4
c = a + b
output.append(c)

with open('output.txt', 'w') as outfile:
    for item in output:
        outfile.write(str(item) + '\n')
于 2013-08-20T19:56:59.240 回答
2

with语句自动关闭文件。最好在with语句中做与文件相关的所有事情(多次打开文件也不是一个好主意)。

with open("test.txt", "a") as xfile:
    # do everything related to xfile here

但是,如果它不能解决您的问题,那么with当与该文件相关的工作完成时,请不要使用该语句并手动关闭该文件。

来自docs

with处理文件对象时最好使用关键字。这样做的好处是文件在其套件完成后正确关闭,即使在途中引发异常也是如此。

于 2013-08-20T19:57:47.807 回答
0

如果没有更多上下文,您的示例没有多大意义,但我将假设您有合法需要多次打开同一个文件。准确回答您的要求,您可以尝试以下操作:

x = lambda:open("test.txt", "a")

with x() as xfile:
    xfile.write("hi")

#works fine until I try again later in the script

with x() as yfile:
    yfile.write("hello")
于 2013-08-20T19:59:56.847 回答
0

使用语句的通常方式with(实际上我认为它们工作的唯一方式)是with open("text.txt") as file:.

with语句用于处理需要打开和关闭的资源。

with something as f:
    # do stuff with f

# now you can no longer use f

相当于:

f = something
try:
    # do stuff with f
finally:    # even if an exception occurs
    # close f (call its __exit__ method)
# now you can no longer use f
于 2013-08-20T20:00:20.420 回答