2013-08-07 28 views
5

xlrdライブラリを使用してExcelファイルをCSVファイルに変換しようとしています。python xlrd xlsxをcsvに変換

しかし、私はこのエラーを得た:Excelファイルが大きすぎるため

UnicodeEncodeError: 'ascii' codec can't encode character u'\u0142' in position 2: ordinal not in range(128)

それはすることができますか?すべての行が正常に動作する原因は、行数が少ないファイルをExcelで処理するためです。しかし、2000行近くのExcelファイルを変換しようとしたときに、このエラーが発生しました。

[UPDATE]

これはコードです:

filepath = './attachments' 
wb = xlrd.open_workbook(os.path.join(filepath, 'result.xls')) 
sheet = wb.sheet_by_index(0) 
fp = open(os.path.join(filepath, 'result.csv'), 'wb') 
wr = csv.writer(fp, quoting=csv.QUOTE_ALL) 
for rownum in xrange(sheet.nrows): 
    wr.writerow(sheet.row_values(rownum)) 
fp.close() 

そして、これはトレースバックです:

Traceback (most recent call last): 
    File "MethodTest.py", line 11, in <module> 
    wr.writerow(sheet.row_values(rownum)) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u0142' in position 2: ordinal not in range(128) 
+0

コードと完全なトレースバックを表示してください。これはスプレッドシートのサイズに起因するものではありません。 –

+0

@MartijnPieters:コードとトレースバックを更新しました。ありがとう。 – Cacheing

答えて

10

あなたはASCIIの範囲外のデータをExcelシートを読んでいます。

ユニコード値をCSVファイルに書き込むと、自動エンコードが行われますが、失敗した文字のASCII範囲外の値の場合は、自動的にエンコードされます。明示的にエンコード:

for rownum in xrange(sheet.nrows): 
     wr.writerow([unicode(val).encode('utf8') for val in sheet.row_values(rownum)]) 

または、(str()range()を使用して)Pythonの3のために:

for rownum in range(sheet.nrows): 
     wr.writerow([str(val).encode('utf8') for val in sheet.row_values(rownum)]) 

あなたは、あなたのニーズに応じて、異なるエンコーディングを選択する必要があるかもしれません。

+0

私はこのエラーを受け取りました: 'AttributeError: 'float'オブジェクトに 'encode'属性がありません。私はStringだけではなく、さまざまな種類のデータを持っているようです。では、これらの異なるタイプのデータをどのように処理できますか。 – Cacheing

+0

私の更新を試してください:-) –

+0

これはすごくうまくいきます!ありがとう。 – Cacheing

関連する問題