3

Python ドキュメントには、Unicode を csv ファイルに書き込むための次のコード例があります。csvモジュールはユニコード文字列を処理できないため、これがその方法であると述べていると思います。

class UnicodeWriter:
    """
    A CSV writer which will write rows to CSV file "f",
    which is encoded in the given encoding.
    """

    def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
        # Redirect output to a queue
        self.queue = cStringIO.StringIO()
        self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
        self.stream = f
        self.encoder = codecs.getincrementalencoder(encoding)()

    def writerow(self, row):
        self.writer.writerow([s.encode("utf-8") for s in row])
        # Fetch UTF-8 output from the queue ...
        data = self.queue.getvalue()
        data = data.decode("utf-8")
        # ... and reencode it into the target encoding
        data = self.encoder.encode(data)
        # write to the target stream
        self.stream.write(data)
        # empty queue
        self.queue.truncate(0)

    def writerows(self, rows):
        for row in rows:
            self.writerow(row)

私は複数のファイルを書いていますが、簡単にするために、コードで上記のクラスをどのように使用するかを示すために、コードのセクションのみを配置しました。

def write(self):
    """
    Outputs the dataset to a csv.
    """
    f = codecs.open(self.filename, 'a')
    writer = UnicodeWriter(f)
    #with open(self.filename, 'a', encoding='utf-8') as f:
    if self.headers and not self.written:
        writer.writerow(self.headers)
        self.written = True
    for record in self.records[self.last_written:]:
        print record
        writer.writerow(record)
    self.last_written = len(self.records)
    f.close()

これは、csv に書き込む前にデータセットを準備するクラス coll データセット内のメソッドです。以前は使用してwriter = csv.writer(f)いましたが、コーデック エラーのため、`UnicodeWriter クラスを使用するようにコードを変更しました。

しかし、私の問題は、csv ファイルを開くと、次のようになることです。

some_header
B,r,ë,k,ò,w,n,i,k,_,b,s
B,r,ë,k,ò,w,n,i,k,_,c,s
B,r,ë,k,ò,w,n,i,k,_,c,s,b
B,r,ë,k,ò,w,n,i,k,_,d,e
B,r,ë,k,ò,w,n,i,k,_,d,e,-,1
B,r,ë,k,ò,w,n,i,k,_,d,e,-,2
B,r,ë,k,ò,w,n,i,k,_,d,e,-,3
B,r,ë,k,ò,w,n,i,k,_,d,e,-,4
B,r,ë,k,ò,w,n,i,k,_,d,e,-,5
B,r,ë,k,ò,w,n,i,k,_,d,e,-,M
B,r,ë,k,ò,w,n,i,k,_,e,n
B,r,ë,k,ò,w,n,i,k,_,e,n,-,1
B,r,ë,k,ò,w,n,i,k,_,e,n,-,2

これらの行は実際には、Brëkòwnik_de-1私は実際に何が起こっているわけではないようなものであるべきです。

データがどのように生成されたかの基本的な考え方を示すために、次の行を追加します。 title = unicode(row_page_title['page_title'], 'utf-8')

4

1 に答える 1

4

この症状は、リストまたはタプルを期待している関数/メソッドに文字列をフィードするようなものを示しています。

writerowsメソッドはリストのリストを期待しており、writerowフィールド値を含むリスト (またはタプル) を期待しています。文字列を入力していて、文字列を反復処理すると文字列が文字のリストを模倣できるため、各列に 1 文字の CSV が得られます。

CSV に列が 1 つしかない場合は、writer.writerow([data])代わりにwriter.writerow(data). 列が 1 つしかない場合、csv モジュールが本当に必要かどうか疑問に思う人もいるかもしれませんが、csv モジュールは面白いもの (CR/LF など) を含むレコードのようなものを処理するので、はい、それは良い考えです。

于 2013-04-11T22:55:06.900 に答える