使用 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>"
我正在尝试使用 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>"