2016-04-30 1 views
2

Я пытаюсь загрузить и обработать файл CSV через HTML-форму, используя «Бутылку». Я уже создал рабочий пример с Tkinter; CSV загружается красиво, и все данные, включая хешированные пароли, попадают в базу данных Sqlite3.Загрузка и обработка файла CSV с использованием Bottle; Возможная ошибка кодирования

РАБОТА 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() 

Вопрос в том, когда я пытаюсь воссоздать код в бутылке, я получаю следующее сообщение об ошибке:

БУТЫЛКИ КОД - HTML :

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

БУТЫЛКИ КОД - ROUTE:

@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> 

Любая помощь приветствуется

ответ

1

request.files.data является FileUpload объектом. Он имеет атрибут с именем file, так:

EDIT: обновление для обработки байтовых потоков, данные urllib с питона-3.x.

import codecs 

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

должен работать, что делает ваш код бутылки выглядеть следующим образом:

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>" 
+0

Hi Тоторо. Спасибо за помощь. Я получаю эту ошибку сейчас ... для x в reader: ... _csv.Error: iterator должен возвращать строки, а не байты (вы открыли файл в текстовом режиме?) –

+0

@VictorEliasRodriguez Да, у вас есть Python 3 .x, где 'urllib' возвращает байты, а' csv' ожидает строки. Таким образом, байты необходимо преобразовать в форму строки, указав кодек. Я обновил свой ответ. – totoro

+0

Работает отлично. Не могу вас поблагодарить! –

Смежные вопросы