プログラマーの皆さん、こんにちは!
この記事では、ローカルおよびリモートの CSV ファイルを処理し、情報をロードして出力し、後で列を Django タイプにマップできる オープンソース ツールを紹介します。通常、CSV ファイルの処理が必要になるのは、データセットが大きくなり、カスタム レポートが Excel でサポートされなくなったり、データ テーブルを介した完全なデータ操作が必要になったり、API が必要になったりする場合です。
現在の機能リストをさらに拡張して、CSV ファイルをデータベース テーブル/モデルにマッピングし、ダッシュボード Web アプリを完全に生成することができます。
ソース コード: AppSeed サービスの CSV プロセッサー部分 (オープンソース)
コードと使用法の説明を始める前に、ツールの機能を要約しましょう:
README で説明されているように、プロジェクト ソースを複製して使用できるようにした後、CSV パーサーを CLI 経由で実行できます。インストールが完了したら、次のワンライナーを使用して CVS プロセッサを呼び出すことができます:
$ python manage.py tool_inspect_source -f media/tool_inspect/csv_inspect.json
このツールは次のタスクを実行します:
同じことがローカル ファイルとリモート ファイルに適用できます。たとえば、次のワンライナーを実行することで、悪名高い Titanic.cvs を分析できます:
$ python manage.py tool_inspect_source -f media/tool_inspect/csv_inspect_distant.json # Output > Processing .\media\tool_inspect\csv_inspect_distant.json |-- file: https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv |-- type: csv Field CSV Type Django Types ----------- ---------- ------------------------------------------ PassengerId int64 models.IntegerField(blank=True, null=True) Survived int64 models.IntegerField(blank=True, null=True) Pclass int64 models.IntegerField(blank=True, null=True) Name object models.TextField(blank=True, null=True) Sex object models.TextField(blank=True, null=True) Age float64 models.FloatField(blank=True, null=True) SibSp int64 models.IntegerField(blank=True, null=True) Parch int64 models.IntegerField(blank=True, null=True) Ticket object models.TextField(blank=True, null=True) Fare float64 models.FloatField(blank=True, null=True) Cabin object models.TextField(blank=True, null=True) Embarked object models.TextField(blank=True, null=True) [1] - PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked [2] - 1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S [3] - 2,1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38,1,0,PC 17599,71.2833,C85,C [4] - 3,1,3,"Heikkinen, Miss. Laina",female,26,0,0,STON/O2. 3101282,7.925,,S [5] - 4,1,1,"Futrelle, Mrs. Jacques Heath (Lily May Peel)",female,35,1,0,113803,53.1,C123,S [6] - 5,0,3,"Allen, Mr. William Henry",male,35,0,0,373450,8.05,,S [7] - 6,0,3,"Moran, Mr. James",male,,0,0,330877,8.4583,,Q [8] - 7,0,1,"McCarthy, Mr. Timothy J",male,54,0,0,17463,51.8625,E46,S [9] - 8,0,3,"Palsson, Master. Gosta Leonard",male,2,3,1,349909,21.075,,S [10] - 9,1,3,"Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)",female,27,0,2,347742,11.1333,,S ... (truncated output)
ツールの関連部分は次のとおりです:
情報を読み込み、ソースがローカルかリモートかを事前にチェックします
print( '> Processing ' ARG_JSON ) print( ' |-- file: ' JSON_DATA['source'] ) print( ' |-- type: ' JSON_DATA['type' ] ) print( '\n') tmp_file_path = None if 'http' in JSON_DATA['source']: url = JSON_DATA['source'] r = requests.get(url) tmp_file = h_random_ascii( 8 ) '.csv' tmp_file_path = os.path.join( DIR_TMP, tmp_file ) if not file_write(tmp_file_path, r.text ): return JSON_DATA['source'] = tmp_file_path else: if not file_exists( JSON_DATA['source'] ): print( ' > Err loading SOURCE: ' JSON_DATA['source'] ) return csv_types = parse_csv( JSON_DATA['source'] )
ヘッダーを分析し、検出された型を Django の型にマッピングします。
表形式ビューの場合、Tabulate Library が使用されます:
csv_types = parse_csv( JSON_DATA['source'] ) #pprint.pp ( csv_types ) table_headers = ['Field', 'CSV Type', 'Django Types'] table_rows = [] for t in csv_types: t_type = csv_types[t]['type'] t_type_django = django_fields[ t_type ] table_rows.append( [t, t_type, t_type_django] ) print(tabulate(table_rows, table_headers))
最後のステップは、CSV データを印刷することです:
csv_data = load_csv_data( JSON_DATA['source'] ) idx = 0 for l in csv_data: idx = 1 print( '[' str(idx) '] - ' str(l) ) # Truncate output .. if idx == 10: print( ' ... (truncated output) ' ) break
この時点で、コードにより、CSV 情報、データ型、および Django の対応するデータ型へのアクセスが提供されます。マッピングは、Flask、Express、NextJS などのフレームワークに簡単に拡張できます。
Django の型マッピングは次のとおりです:
# Pandas Type django_fields = { 'int' : 'models.IntegerField(blank=True, null=True)', 'integer' : 'models.IntegerField(blank=True, null=True)', 'string' : "models.TextField(blank=True, null=True)", 'string_unique' : "models.TextField(blank=True, null=False, unique=True)", 'object' : "models.TextField(blank=True, null=True)", 'object_unique' : "models.TextField(blank=True, null=False, unique=True)", 'int64' : 'models.IntegerField(blank=True, null=True)', 'float64' : 'models.FloatField(blank=True, null=True)', 'bool' : 'models.BooleanField(null=True)', }
このツールは現在開発中です。次の手順は次のとおりです:
読んでいただきありがとうございます!
貢献に興味がある方は、お気軽に新しい AppSeed プラットフォームに参加し、Discord のコミュニティとつながりましょう:
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3