使用 Bottle 上传和处理 CSV 文件;可能的编码问题

Uploading and Processing a CSV File using Bottle; Possible Encoding Issue

我正在尝试使用 Bottle 通过 HTML 表单上传和处理 CSV 文件。我已经用 Tkinter 创建了一个工作示例; CSV 上传很好,所有数据(包括散列密码)都进入了 Sqlite3 数据库。

工作 TKINTER 代码...

import os
import sqlite3
import csv
from pbkdf2 import crypt
from tkinter import *
from tkinter import filedialog
root = Tk()
root.geometry("500x500")

def open1():
    filename = filedialog.askopenfilename()
    with open(filename,"r") as s_info:
        reader = csv.reader(s_info)
        for x in reader:
            pwhash = crypt(x[1])
            connection = sqlite3.connect("users.db")
            cursor_v = connection.cursor()
            cursor_v.execute("insert into users (cemail, cpassword) values (?,?)", (x[0],pwhash))
            connection.commit()
            cursor_v.close()
        else:
            print("CSV Uploaded")

x = Button(text="Open",command=open1).pack()

问题是当我尝试在 Bottle 中重新创建代码时,出现以下错误:

瓶子代码 - HTML:

<form action="/panel" method="post" enctype="multipart/form-data">
  <input type="file" name="data" />
  <input type="submit">
</form>

瓶子代码 - 路线:

@route('/panel', method='POST')
def do_upload():
    data = request.files.data
    with open(data,"r") as s_info:
        reader = csv.reader(s_info)
        for x in reader:
            pwhash = crypt(x[1])
            connection = sqlite3.connect("users.db")
            cursor_v = connection.cursor()
            cursor_v.execute("insert into users (cemail, cpassword) values (?,?)", (x[0],pwhash))
            connection.commit()
            cursor_v.close()
        else:
            return "<p>CSV Uploaded</p>"

错误:

with open(data,"r") as s_info:
TypeError: invalid file: <bottle.FileUpload object at 0x105cb84d0>

感谢任何帮助

request.files.data 是一个 FileUpload 对象。它有一个名为 file 的属性,因此:

编辑:已更新以处理由 urllib 和 python-3.x.

给出的字节流
import codecs

def do_upload():
    reader = csv.reader(codecs.iterdecode(request.files.data.file, 'utf-8'))
    for x in reader:
        ...

应该可以,让你的 bottle 代码看起来像这样:

import codecs

@route('/panel', method='POST')
def do_upload():
    reader = csv.reader(codecs.iterdecode(request.files.data.file, 'utf-8'))
    for x in reader:
        pwhash = crypt(x[1])
        connection = sqlite3.connect("users.db")
        cursor_v = connection.cursor()
        cursor_v.execute("insert into users (cemail, cpassword) values (?,?)", (x[0],pwhash))
        connection.commit()
        cursor_v.close()
    else:
        return "<p>CSV Uploaded</p>"