在循环中写入文件时出现"ValueError: I/O操作在关闭的文件上

0 投票
4 回答
2528 浏览
提问于 2025-04-17 23:50
out1.txt
 1
 2
 3
 4

out2.txt
 5
 6
 7
 8

我需要把一个文件 file.txt 分成多个文件。这里是我的代码:

a = 0
b = open("sorgente.txt", "r")
c = 5
d = 16 // c
e = 1
f = open("out"+str(e)+".txt", "w")
for line in b:
    a += 1
    f.writelines(line)
    if a == d:
        e += 1
        a = 0
        f.close()
f.close()

但是,当我运行它的时候,出现了这个错误:

todoController\WordlistSplitter.py", line 9, in <module>
    f.writelines(line)
ValueError: I/O operation on closed file

我明白了,如果在 for 循环里处理文件,文件会被关闭。所以我试着把 f 放在 for 循环里,但这样不行,因为我得到的结果只是文件的最后一行。那我该怎么办呢?有没有办法重新调用我之前定义的打开文件的函数?

4 个回答

0

你可能应该去掉第一个 f.close()

a = 0
b = open("sorgente.txt", "r")
c = 5
d = 16 // c
e = 1
f = open("out"+str(e)+".txt", "w")
for line in b:
    a += 1
    f.writelines(line)
    if a == d:
        e += 1
        a = 0
        # f.close()
f.close()
0

如果 a 等于 d,你就关闭了 f,然后在下一次循环中又试图写入 f,这样就会导致错误。
另外,为什么要关闭 f 两次呢?

0

你关闭了文件,但并没有退出循环。

1

你在 for 循环里面用了 f.close(),然后又没有重新用 f 打开一个新文件,所以在下一次循环的时候就会出错。你还应该使用 with 来处理文件,这样就不需要手动去 close 它们了。

因为你想每次写四行到每个 out 文件里,你可以这样做:

file_num = 0
with open("sorgente.txt") as in_file:
    for line_num, line in enumerate(in_file):
        if not line_num % 4:
            file_num += 1
        with open("out{0}.txt".format(file_num), "a") as out_file:
            out_file.writelines(line)

注意,我用了变量名来让事情变得更清楚。

撰写回答