2

xlrdを使用してExcelファイルを読み取ってtxtファイルに書き込もうとしています。'Téd'のようなスペイン語の文字を含む一部の行を除いて、すべてが正常に書き込まれています。latin-1エンコーディングを使用してそれらをエンコードできます。ただし、コードは、ユニコードu'\u2013'の'â'を持つ他の行では失敗します。u'\ 2013'は、latin-1を使用してエンコードすることはできません。UTF-8を使用する場合、「â」は正常に書き出されますが、「Téd」は「Téd」として書き出されます。これは受け入れられません。これを修正するにはどうすればよいですか。

以下のコード:

#!/usr/bin/python
import xlrd
import csv
import sys

filePath     = sys.argv[1]

with xlrd.open_workbook(filePath) as wb:
     shNames = wb.sheet_names()
     for shName in shNames:
         sh = wb.sheet_by_name(shName)
         csvFile = shName + ".csv"
         with open(csvFile, 'wb') as f:
              c = csv.writer(f)
              for row in range(sh.nrows):
                  sh_row = []
                  cell = ''
                  for item in sh.row_values(row):
                      if isinstance(item, float):
                         cell=item
                      else:
                         cell=item.encode('utf-8')
                      sh_row.append(cell)
                      cell=''
                  c.writerow(sh_row)
         print shName + ".csv File Created"
4

1 に答える 1

2

Pythonのcsvモジュール

Unicode 入力をサポートしていません。

入力を書き込む前に正しくエンコードしているため、必要はありませんcodecs。ちょうどopen(csvFile, "wb")(これbが重要です)、そのオブジェクトをライターに渡します。

with open(csvFile, "wb") as f:
    writer = csv.writer(f)
    writer.writerow([entry.encode("utf-8") for entry in row])

または、エンコーディングを処理するunicodecsvのドロップイン代替品です。csv


UTF-8 でエンコードされたテキストを latin-1 と間違えているため、é代わりに取得しています。これはおそらく、1 回と1 回の 2 回エンコードしているためです。é.encode("utf-8")codecs.open


ちなみに、xlrdセルの型を確認する正しい方法はcell.ctype == xlrd.ONE_OF_THE_TYPES.

于 2012-11-16T16:04:18.543 に答える