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([''] +アクター)ValueError:閉じたファイルのI/O操作。

4

3 に答える 3

3

がモードの場合b、ファイルはテキストモードではなくバイナリモードで開かれます。それを除く。

于 2012-09-29T23:40:18.967 に答える
0

問題は、間違った変数を参照していることです。早い段階でファイルオブジェクトを作成しfp、後で作成しますcsvwriter。2番目の部分では、に書き込む必要がありますcsvwriterが、代わりにに書き込みますfp。例外は、それがすでに閉じられていることを通知することです。これは、ブロックfpから離れたときに発生します。with

最初のブロックは問題ありません:

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

2番目のブロックはまだ参照していることに注意してくださいfp

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

csvモジュールのドキュメントには、open(fname, 'rb')または'wb'-つまりバイナリモードでと書かれています。ただし、これはPython2.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)
    ...

さもなければ、ティムはあなたが間違って間違ったファイルオブジェクトをライターに渡したとすでに指摘しました。そのため、変数に実際にわかりやすい名前を付けることをお勧めします。また、ファイル名変数とは異なる名前をファイルオブジェクト変数に付ける場合にも役立ちます。

また、コードは将来変更されるため、最初にファイル名を変数に割り当てることをお勧めします。次に、次のように、コードのブロックを後で関数本体に変換するのは簡単です。

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 に答える