首页 > 解决方案 > ValueError:对带有“with”块的缩进文件上的已关闭文件的 I/O 操作

问题描述

with open('C:\\Users\\Download.csv', 'r') as file :
    filedata = csv.reader(file, delimiter=',', quotechar='|')
    for c in range(sum(1 for row in filedata)):
        for d in range(80):
            data_found = data_to_match.search(filedata)
            if data_found != None:
                data_found_new = str(data_found.group(0)).replace(',','.')
                filedata = filedata.replace(str(data_found.group(0)) , data_found_new)
        for e in range(80):
            data_found_2 = data_to_match_2.search(filedata)
            if data_found_2 != None:
                data_found_2_new = str(data_found_2.group(0)).replace(', ', '; ')
                filedata = filedata.replace(str(data_found_2.group(0)),data_found_2_new)

with open('C:\\Users\\Download.csv', 'w', newline='') as file2:
    writer = csv.writer(file2, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    writer.writerows(filedata)

这给了我一个 ValueError: I/O operation on closed file (对于行 writer.writerows(filedata))。我试图查找错误,但我发现的只是那些没有缩进他们的代码的人。但至少在我看来,这看起来不像是这里的问题。

编辑:示例输入

文件的第一行:"Datum","Uhrzeit","Zeitzone","Name","Typ","Status","Währung","Brutto","Gebühr","Netto","Absender E- Mail-Adresse”、“Empfänger E-Mail-Adresse”、“Transaktionscode”、“Lieferadresse”、“Adress-Status”、“Artikelbezeichnung”、“Artikelnummer”、“Versand- und Bearbeitungsgebühr”、“Versicherungsbetrag”、“Umsatzsteuer” ,"Option 1 Name","Option 1 Wert", "Option 2 Name","Option 2 Wert","Zugehöriger Transaktionscode", "Rechnungsnummer","Zollnummer","Anzahl","Empfangsnummer","Guthaben", "Adresszeile1","Adresszusatz","Ort","Bundesland","PLZ","Land","Telefon","Betreff","Hinweis","Ländervorwahl","Auswirkung auf Guthaben"

文件第二行:"02.03.2019","11:25:51","PST","Delivery Hero Germany GmbH - Lieferheld", "PayPal Express-Zahlung","Abgeschlossen","EUR","- 12,35","0,00", "-12,35","jjjjjjj@gmail.com","cc_finance@deliveryhero.com","00000000000", "111 jjjjjjj Straße, aaaaaaaa, 55555, Deutschland", "Bestätigt", "1111111111111","11111111","0,00","","0,00","","","","","", "444444444444", "Lieferheld_DE:11111111111111111 :111111111:11111:11111111111:paypal","1","", "-12,35","111 jjjjjjj Straße","","aaaaaaaa","","555555","德国","","99999999999999","","DE","Soll"

标签: pythoncsv

解决方案


解决方案1:

内部带有开放块的变量“filedata”,它是csv对象。因此,一旦您离开此块,该文件将自动关闭,并且您在 2nd 中使用相同的文件数据对象和打开块。

最好取一个变量并将 csv 对象的所有值放入第二个带有 open 块的值。

f2 = []
with open('C:\\Users\\Download.csv', 'r') as file :
    filedata = csv.reader(file, delimiter=',', quotechar='|')
    for x in filedata:
        f2.append(x)

with open('C:\\Users\\Download.csv', 'w') as file2:
    writer = csv.writer(file2, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    writer.writerows(f2)

解决方案 2:而不是在第一个块中打开,只使用打开。

f_obj = open('C:\\Users\\Download.csv', 'r')
filedata = csv.reader(f_obj, delimiter=',', quotechar='|')

with open('C:\\Users\\Download.csv', 'w') as file2:
    writer = csv.writer(file2, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    writer.writerows(filedata)

推荐阅读