「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > CSV - Python でローカル ファイルとリモート ファイルを処理する

CSV - Python でローカル ファイルとリモート ファイルを処理する

2024 年 8 月 29 日に公開
ブラウズ:856

CSV - Process Local & Remote Files in Python

プログラマーの皆さん、こんにちは!

この記事では、ローカルおよびリモートの CSV ファイルを処理し、情報をロードして出力し、後で列を Django タイプにマップできる オープンソース ツールを紹介します。通常、CSV ファイルの処理が必要になるのは、データセットが大きくなり、カスタム レポートが Excel でサポートされなくなったり、データ テーブルを介した完全なデータ操作が必要になったり、API が必要になったりする場合です。
現在の機能リストをさらに拡張して、CSV ファイルをデータベース テーブル/モデルにマッピングし、ダッシュボード Web アプリを完全に生成することができます。

ソース コード: AppSeed サービスの CSV プロセッサー部分 (オープンソース)


コードと使用法の説明を始める前に、ツールの機能を要約しましょう:

  • ローカル ファイルとリモート ファイルをロード
  • 値を出力
  • 検出された列タイプを印刷
  • マッピング タイプを Django モデルに出力します

README で説明されているように、プロジェクト ソースを複製して使用できるようにした後、CSV パーサーを CLI 経由で実行できます。インストールが完了したら、次のワンライナーを使用して CVS プロセッサを呼び出すことができます:

$ python manage.py tool_inspect_source -f media/tool_inspect/csv_inspect.json

このツールは次のタスクを実行します:

  • 入力を検証します
  • CSV ファイルを見つけます (見つからない場合はエラーで終了します)
  • 情報をロードし、列の型を検出します
  • Django 列の型を検出します
  • 最初の 10 行を印刷します

同じことがローカル ファイルとリモート ファイルに適用できます。たとえば、次のワンライナーを実行することで、悪名高い 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)',
}

このツールは現在開発中です。次の手順は次のとおりです:

  • ツールをリモート/ローカル データベース (SQLite、MySql、PgSQL)、JSON などのより多くのデータ ソースに接続します
  • あらゆるフレームワークのモデルを生成: FastAPI、Flask、Express、NextJS
  • 安全な API を最上位に生成
  • Tailwind/Bootstrap を使用してサーバー側でページ分割された DataTable をスタイル設定に生成する

読んでいただきありがとうございます!

貢献に興味がある方は、お気軽に新しい AppSeed プラットフォームに参加し、Discord のコミュニティとつながりましょう:

  • AppSeed - 開発者向けのオープンソース プラットフォーム
  • AppSeed コミュニティ - 3,000 人の Discord メンバー
リリースステートメント この記事は次の場所に転載されています: https://dev.to/sm0ke/csv-process-local-remote-files-in-python-3b64?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3