csv写入器未关闭文件

26 投票
6 回答
85578 浏览
提问于 2025-04-16 01:55

我正在读取一个CSV文件,然后写入一个新的文件:

import csv

with open('thefile.csv', 'rb') as f:
  data = list(csv.reader(f))

import collections
counter = collections.defaultdict(int)
for row in data:
    counter[row[11]] += 1

writer = csv.writer(open('/pythonwork/thefile_subset1.csv', 'w'))
for row in data:
    if counter[row[11]] >= 500:
       writer.writerow(row)

但不知道为什么,我无法让csv.writer关闭这个文件。当我打开这个文件时,它显示为只读,因为它说文件仍然是打开的。

我该怎么做才能在完成后关闭thefile_subset1.csv这个文件呢?

6 个回答

6

要关闭的是文件,而不是CSV写入器。为此,你需要先打开文件,然后再创建写入器,而不是把这两个步骤放在一行里。

import csv
import collections

with open('thefile.csv', 'rb') as f:
    data = list(csv.reader(f))

counter = collections.defaultdict(int)
for row in data:
    counter[row[11]] += 1

f.close()  # good idea to close if you're done with it

fSubset = open('/pythonwork/thefile_subset1.csv', 'w')
writer = csv.writer(fSubset)
for row in data:
    if counter[row[11]] >= 500:
        writer.writerow(row)

fSubset.close()

另外,我建议把所有的导入语句放在脚本的最上面,并在完成文件操作后关闭第一个文件。

25

你可以把打开文件的命令单独放到一个变量里,这样你就可以在需要的时候关闭它。

f = open('/pythonwork/thefile_subset1.csv', 'w')
writer = csv.writer(f)
f.close()

csv.writer 在你尝试往一个已经关闭的文件写东西时,会报一个 ValueError 错误。

37

当然可以!请看下面的内容:

在编程中,有时候我们需要让程序根据特定的条件来执行不同的操作。这就像你在做决定时,会根据不同的情况选择不同的方案。例如,如果今天下雨,你可能会选择待在家里;如果天气晴朗,你就会出去玩。

在代码里,我们可以使用“条件语句”来实现这种逻辑。条件语句就像是一个判断的开关,它会检查某个条件是否成立,然后决定执行哪一段代码。最常见的条件语句是“if语句”。

简单来说,if语句的结构是这样的:

with open('/pythonwork/thefile_subset1.csv', 'w') as outfile:
    writer = csv.writer(outfile)
    for row in data:
        if counter[row[11]] >= 500:
           writer.writerow(row)

这里的“条件”就是你要判断的事情。如果这个条件成立,程序就会执行“代码块1”;如果不成立,它就会执行“代码块2”。

通过这种方式,程序能够根据不同的情况做出不同的反应,让它变得更加灵活和智能。

撰写回答