web-dev-qa-db-ja.com

Python)でxlrdを使用して数値Excelデータをテキストとして読み取る

Xlrdを使用してExcelファイルを読み込もうとしていますが、Excelファイルで使用されているセルの書式を無視して、すべてのデータをテキストとしてインポートする方法があるかどうか疑問に思っています。

これが私がこれまで使用してきたコードです:

import xlrd

xls_file = 'xltest.xls'
xls_workbook = xlrd.open_workbook(xls_file)
xls_sheet = xls_workbook.sheet_by_index(0)

raw_data = [['']*xls_sheet.ncols for _ in range(xls_sheet.nrows)]
raw_str = ''
feild_delim = ','
text_delim = '"'

for rnum in range(xls_sheet.nrows):
    for cnum in range(xls_sheet.ncols):
        raw_data[rnum][cnum] = str(xls_sheet.cell(rnum,cnum).value)

for rnum in range(len(raw_data)):
    for cnum in range(len(raw_data[rnum])):
        if (cnum == len(raw_data[rnum]) - 1):
            feild_delim = '\n'
        else:
            feild_delim = ','
        raw_str += text_delim + raw_data[rnum][cnum] + text_delim + feild_delim

final_csv = open('FINAL.csv', 'w')
final_csv.write(raw_str)
final_csv.close()

このコードは機能しますが、郵便番号など、数値としてインポートされる特定のフィールドがあるため、10進数のゼロサフィックスが付いています。たとえば、Excelファイルに「79854」の郵便番号がある場合、「79854.0」としてインポートされます。

私はこれで解決策を見つけようとしました xlrd spec ですが、失敗しました。

17
Brian

これは、Excelの整数値がPythonの浮動小数点数としてインポートされるためです。したがって、sheet.cell(r,c).valueはfloatを返します。値を整数に変換してみてください。ただし、最初に、Excelでこれらの値が整数であることを確認してください。

cell = sheet.cell(r,c)
cell_value = cell.value
if cell.ctype in (2,3) and int(cell_value) == cell_value:
    cell_value = int(cell_value)

それすべて xlrd仕様 にあります。

23
ktdrv

これが質問の一部ではないことはわかっていますが、raw_strを削除して、csvに直接書き込みます。大きなファイル(10,000行)の場合、これにより時間の負荷を節約できます。

raw_dataを削除して、forループを1つだけ使用することもできます。

4
Josh