csv writer没有关闭文件

l--*_*''' 18 python csv

我正在读取一个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)
Run Code Online (Sandbox Code Playgroud)

由于某种原因,我无法让csv.writer关闭文件.当我打开文件时,它只打开它,因为它说它仍然是打开的.

我完成后如何关闭file_subset1.csv?

Joh*_*ooy 28

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)
Run Code Online (Sandbox Code Playgroud)


Don*_*ner 23

您可以将open命令分解为自己的变量,以便稍后关闭它.

f = open('/pythonwork/thefile_subset1.csv', 'w')
writer = csv.writer(f)
f.close()
Run Code Online (Sandbox Code Playgroud)

csv.writerValueError如果您尝试写入已关闭的文件,则抛出a .

  • 最好使用另一个“with”语句,就像最初用来读取数据一样。 (2认同)

Jim*_*use 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()
Run Code Online (Sandbox Code Playgroud)

此外,我建议您将导入保留在脚本的顶部,并在完成后关闭第一个文件.


Jam*_*oth 5

强制写入器清理:

del writer
Run Code Online (Sandbox Code Playgroud)

  • -1 不能保证清理操作会立即发生(这取决于您使用的 Python 实现)。 (2认同)
  • [`del` 语句](http://docs.python.org/reference/simple_stmts.html#grammar-token-del_stmt) *only* 删除名称绑定:“删除名称会从本地或全局命名空间,取决于名称是否出现在同一代码块中的全局语句中。” 它没有说明何时可能发生清理。 (2认同)
  • +1 唯一能解决我的问题的答案。所有其他的都是追溯性的(即这是您将来应该做的事情)。需要注意的是,你应该在之后立即调用 `gc.collect()` 来手动启动垃圾收集。 (2认同)