PARSE CSV 檔案上傳作為 FLASK 中的字典列表,沒有儲存

開發人員通常需要設計允許使用者上傳 CSV 檔案的網站。通常有任何理由儲存實際 CSV 檔案,因為該資料將處理和/或儲存在一次上傳的資料庫。但是,許多(如果不是大多數)解析 CSV 資料的 PYTHON 方法需要將資料作為檔案讀入。如果你使用 FLASK 進行 Web 開發,這可能會讓你感到頭疼。

假設我們的 CSV 有一個標題行,如下所示:

h1,h2,h3
'yellow','orange','blue'
'green','white','black'
'orange','pink','purple'

現在,假設上傳檔案的 html 表單如下:

<form action="upload.html" method="post" enctype="multipart/form-data">
    <input type="file" name="fileupload" id="fileToUpload">
    <input type="submit" value="Upload File" name="submit">
</form>

由於沒有人想要重新發明輪子,因此你決定將 csv 匯入到 FLASK 指令碼中。無法保證人們會按照正確的順序上傳包含列的 csv 檔案。如果 csv 檔案有一個標題行,那麼在 csv.DictReader 方法的幫助下,你可以將 CSV 檔案作為字典列表讀取,並按標題行中的條目鍵入。但是, csv.DictReader 需要一個檔案,並不直接接受字串。你可能認為需要使用 FLASK 方法首先儲存上傳的檔案,獲取新的檔名和位置,使用 csv.DictReader 開啟它,然後刪除該檔案。似乎有點浪費。

幸運的是,我們可以將檔案內容作為字串獲取,然後通過終止行分割字串。csv 方法 csv.DictReader 將接受它作為檔案的替代。以下程式碼演示瞭如何在不臨時儲存檔案的情況下完成此操作。

@application.route('upload.html',methods = ['POST'])
def upload_route_summary():
    if request.method == 'POST':

        # Create variable for uploaded file
        f = request.files['fileupload']  

        #store the file contents as a string
        fstring = f.read()
        
        #create list of dictionaries keyed by header row
        csv_dicts = [{k: v for k, v in row.items()} for row in csv.DictReader(fstring.splitlines(), skipinitialspace=True)]

        #do something list of dictionaries
    return "success"

變數 csv_dicts 現在是以下字典列表:

   csv_dicts = 
    [
        {'h1':'yellow','h2':'orange','h3':'blue'},
        {'h1':'green','h2':'white','h3':'black'},
        {'h1':'orange','h2':'pink','h3':'purple'}
    ]

如果你不熟悉 PYTHON,你可以訪問以下資料:

csv_dicts[1]['h2'] = 'white'
csv_dicts[0]['h3'] = 'blue'

其他解決方案涉及匯入 io 模組並使用 io.Stream 方法。我覺得這是一種更直接的方法。我相信程式碼比使用 io 方法更容易理解。此方法特定於解析上載的 CSV 檔案的示例。