首頁  >  文章  >  後端開發  >  CSV - 在 Python 中處理本地和遠端文件

CSV - 在 Python 中處理本地和遠端文件

WBOY
WBOY原創
2024-08-28 18:30:37486瀏覽

CSV - Process Local & Remote Files in Python

編碼員們大家好!

本文介紹了一個開源工具,能夠處理本地和遠端 CSV 檔案、載入和列印訊息,然後將列對應到 Django 類型。當資料集變大、Excel 不支援自訂報告或透過資料表進行完整資料操作時,通常需要處理 CSV 文件,並且需要 API。
目前的功能清單可以進一步擴展,以將 CSV 檔案對應到資料庫表/模型並完全產生儀表板 Web 應用程式。

原始碼:AppSeed 服務的 CSV 處理器部分(開源)


在開始講解程式碼和用法之前,我們先總結一下工具的特點:

  • 載入本機和遠端檔案
  • 列印值
  • 列印偵測到的欄位類型
  • 將映射類型列印到 Django 模型

在依照 README 中的說明複製專案來源並使其可用後,可以透過 CLI 執行 CSV 解析器。安裝完成後,我們可以使用以下一行來呼叫 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 庫:

    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 產生伺服器端分頁資料表進行樣式設定

感謝您的閱讀!

對於有興趣做出貢獻的人,請隨時加入新的 AppSeed 平台並在 Discord 上與社群聯繫:

  • AppSeed - 開發者的開源平台
  • AppSeed 社群 - 3k+ Discord 成員

以上是CSV - 在 Python 中處理本地和遠端文件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn