Python ValueError:在关闭文件的情况下进行I/O操作

4

我知道这听起来是一个常见的错误,在stackoverflow上已经被多次询问。然而,我很确定我的问题是新的,因为我几乎阅读了所有相关主题。

我有两个文件如下:

ALL_USER_PATH = 'all.csv'
NEW_USER_PATH = 'new.csv'

我先打开“all”文件以进行读取。
with open(ALL_USER_PATH, "r") as f:
    df = pd.read_csv(f) #pd is pandas
    f.close()

接下来,我将删除“新”文件的内容,并准备向其中写入新数据。

if os.path.isfile(NEW_USER_PATH):
    os.remove(NEW_USER_PATH)

写入它,它可以正常工作。

with open(NEW_USER_PATH, "a") as csv_n:
    #writer_n is to write new users
    writer_n = csv.writer(csv_n, delimiter=",", lineterminator='\n')
    for user in customer_records:         
        if checkExistence(df): # a method I wrote before
            continue
        else:    
            writer_n.writerow([data_to_be_written])

接下来,我将删除“all”文件并向其中写入新的数据。
if os.path.isfile(ALL_USER_PATH):
    os.remove(ALL_USER_PATH)

with open(ALL_USER_PATH, "a") as csv_a:
    writer_a = csv.writer(csv_n, delimiter=",", lineterminator='\n')

    for user in customer_records:
        writer_a.writerow([all_data_to_be_written])

最后一行写入数据到“all”文件时,会抛出错误:

"ValueError i/o operation on closed file"

我认为是因为我之前打开了它,但我记得在读取数据后关闭了它,难道不是吗?请问有人可以告诉我问题出在哪里吗?


3
您应该使用writer_a = csv.writer(csv_a, delimiter=",", lineterminator='\n'),但您意外地重用了csv_n。如果您使用更具体的名称,则会更清晰(或者在使用完名称后重新使用它们,也可以避免这种情况发生)。 - SuperBiasedMan
是的,我为那个打字错误感到非常抱歉。这就是为什么我的问题与其他人不同的原因。现在我感觉很愚蠢。 - Duy Bui
每个人都会犯错,特别是只差一个字母的时候。很高兴现在它能为您工作了! - SuperBiasedMan
如果您使用了 with 语句,就不需要再调用 f.close 方法。 - memoselyk
1个回答

10

我之前也遇到过这个错误,但在另一个问题的答案中找到了解决方法,并且它确实管用。

当你退出 with open (csv file.csv) as csv: 下的缩进块时,它会关闭文件。

with open('ALL_USER_PATH','a') as csv_a:
    writer_a = csv.writer(csv_n, delimiter=",", lineterminator='\n')
    # Here the file stays open
# Here the file is closed

我希望我能够帮到你。


我在SuperBiasedMan的评论中找到了答案。我认为它很准确。 - Duy Bui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接