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 文件的示例。