2

csv および xlrd パッケージが空のセルを処理するデフォルトの方法を変更するオプションはありますか? デフォルトでは、空のセルには空の文字列値 = '' が割り当てられます。空の文字列は None 値ではないため、これはデータベースで作業している場合に問題になります。これは、データベースとやり取りする多くの python パッケージ (SQLAlchemy など) がデータベースを使用するためにNullとして処理できるためです。

たとえば、decimal/integer/float/double であると想定されるフィールドで空のセルが発生した場合、文字列の挿入が decimal/integer/float/ 型のフィールドに行われたため、データベースは例外をスローします。ダブル。

これを行う方法を示す例やドキュメントは見つかりませんでした。私の現在のアプローチは、データを検査して次のことを行うことです。

if item[i] == '': 
   item[i] = None

これの問題は、私がデータを所有しておらず、その品質を制御できないことです。多くのアプリがそれら以外のソースによって生成されたファイル/データを使用しているため、これはよくあることだと想像できます。

デフォルトの扱いを変更する方法があれば、それは私の意見では賢明なアプローチです。

4

3 に答える 3

1

私はあなたと同じ設定をしています(ORMのsqlalchemyと、Excelファイルを介して供給されるデータをほとんど制御できません)。データベースにダンプする前に、xlrd からデータをキュレートする必要があることがわかりました。xlrd モジュールに適用できる微調整については知りません。

より一般的な注意事項: できるだけ多くの例の Excel ファイルのサンプルを取得して、アプリケーションがそれに対処できるかどうかを確認することをお勧めします。ときどき変な文字が Excel を通過し (人々はさまざまな言語からコピーして貼り付けます)、さらにクラッシュすることがあることがわかりました。また、場合によってはファイル形式が UTF-8 ではなく iso-8859 などであることがわかりました。ファイルの変換にiconvを使用することになりました。

このスタックオーバーフローの記事もご覧ください。

全体的に xlrd はうまく機能していますが、プロジェクトに関する活動にはあまり感銘を受けません。メンテナンスの少ないライブラリを使用しているようです。

于 2013-03-28T06:17:44.773 に答える
0

次のコードを使用して、実際にデータを読み込む前に、読み込んでいるシート内のすべての空のセルの値を NULL (または None、または好きなもの) に変更できます。すべての行と列をループし、cell_type が EMPTY かどうかを確認してから、それぞれのセルの値を 'NULL' に変更します。

import xlrd

book = xlrd.open_workbook("data.xlsx")
sheet_name = book.sheet_names()[0] #getting the sheetname of the  first sheet
sheet = book.sheet_by_name(sheet_name)

for r in range(0,sheet.nrows): #create a list with all row numbers that contain data and loop through it
    for s in range(0, sheet.ncols):       #create a list with all column numbers that contain data and loop through i
        if sheet.cell_type(r, c) == xlrd.XL_CELL_EMPTY:
            sheet._cell_values[r][c] = 'NULL'

次に、データを (たとえば最初の列から) 読み取ることができ、セルが以前に空だった場合、値として NULL を取得します。

for r in range(0,sheet.nrows):
    data_column_1 = sheet.cell(r,0).value
于 2015-01-20T19:31:47.513 に答える
-1

xlrdセルの種類 (空または空白、テキスト、数値、日付、エラー) が表示されます。

これについては、xlrdドキュメントで説明されています。Cell クラスと、Sheet クラスのこれらのメソッド (cell_type、col_types、および row_types) を見てください。

このcsv形式には、「データがまったくない」ことと「値が長さ 0 の文字列であること」の違いを表現する方法がありません。あなたはまだそれをチェックして''それに応じて行動する必要があります.

于 2013-03-29T11:30:08.217 に答える