1

给出了一些代码(我使用的是 Python 3.2),并不断收到以下错误。

import csv
import collections
import itertools

grid = collections.Counter()

with open("test1.csv", "r") as fp:
reader = csv.reader(fp)
for line in reader:
    for pair in itertools.combinations(line, 2):
        grid[pair] += 1
        grid[pair[::-1]] += 1

actors = sorted(set(pair[0] for pair in grid))

with open("connection_grid.csv", "wb") as csvfile:
    writer = csv.writer(fp)
    writer.writerow([''] + actors)
    for actor in actors:
        line = [actor,] + [grid[actor, other] for other in actors]
        writer.writerow(line)

但我收到了这个错误。

回溯(最后一次调用):文件“C:/Python32/test.py”,第 21 行,在 writer.writerow([''] +actors) 中 ValueError:对已关闭文件的 I/O 操作。

4

3 回答 3

3

如果b处于模式,则文件以二进制模式打开,而不是文本模式。去掉它。

于 2012-09-29T23:40:18.967 回答
0

模块的文档csvopen(fname, 'rb')'wb'- 即二进制模式。但这仅适用于 Python 2.x。

在 Python 3 中,CSV 文件必须以正常的文本模式打开。但是,仍然必须做一些特别的事情。文档说(见http://docs.python.org/release/3.2.3/library/csv.html#csv.reader):

如果 csvfile 是一个文件对象,它应该用newline=''.

所以,正确的做法是:

with open("test1.csv", newline='') as fp:
    reader = csv.reader(fp)
    ...
...
with open("connection_grid.csv", "w", newline='') as csvfile:
    writer = csv.writer(csvfile)
    ...

另外,Tim 已经指出您错误地将错误的文件对象传递给了编写器。正因为如此,最好给变量提供真正的描述性名称。当您为文件对象变量提供与文件名变量不同的名称时,它也会有所帮助。

此外,由于将来要修改代码,最好先将文件名分配给变量。然后很容易将代码块转换为函数体,如下所示:

def csv_transformation(csvname_in, csvname_out):
    with open(csvname_in, newline='') as finput:
        reader = csv.reader(finput)
        ...
    ...
    with open(csvname_out, 'w', newline='') as foutput:
        writer = csv.writer(foutput)
        ...

在这种情况下,更难犯错误。

于 2012-09-30T10:08:59.677 回答
0

问题是您指的是错误的变量。早期,您创建一个文件对象fp,然后创建csvwriter. 在第二部分中,您应该写信给csvwriter,但您写信给fp. 例外是告诉您fp已经关闭,这就是您从with块中删除时发生的情况。

第一个块很好:

with open("test1.csv", "r") as fp:
    reader = csv.reader(fp)
    ...

请注意,第二个块仍然指的是fp

with open("connection_grid.csv", "wb") as csvfile:
    writer = csv.writer(fp)
    ...
于 2012-09-30T00:39:35.147 回答