ホームページ  >  記事  >  バックエンド開発  >  CSV - Python でローカル ファイルとリモート ファイルを処理する

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

WBOY
WBOYオリジナル
2024-08-28 18:30:37486ブラウズ

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 メンバー

以上がCSV - Python でローカル ファイルとリモート ファイルを処理するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。