Piszę moją pierwszą aplikację na kolbę. Mam do czynienia z wgrywaniem plików iw zasadzie to czego chcę to odczytać dane / zawartość wgranego pliku bez jego zapisywania a następnie wydrukować na wynikowej stronie. Tak, zakładam, że użytkownik zawsze przesyła plik tekstowy.
Oto prosta funkcja przesyłania, której używam:
@app.route('/upload/', methods=['GET', 'POST'])
def upload():
if request.method == 'POST':
file = request.files['file']
if file:
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
a = 'file uploaded'
return render_template('upload.html', data = a)
W tej chwili zapisuję plik, ale potrzebuję zmiennej „a”, która będzie zawierała zawartość / dane pliku… jakieś pomysły?
file = request.files.get('file')
filetype = magic.from_buffer(file.read(1024))
f = request.files['file']
umieszcza przesłany plik (w żądaniu) do var ("f"). Następnief.read()
działa przy użyciu powyższego kodu. kiedyprint f.read()
mam poprawnie wyglądające śmieci w terminalu. Mam nadzieję, że to pomoże.mystring = TextIOWrapper(binary_stream)
f.read()
dla mnie też nic nie dało. Pierwszaf.seek(0)
rozmowa załatwiła mi sprawę.Jeśli chcesz używać standardowych rzeczy z Flask - nie ma sposobu, aby uniknąć zapisywania pliku tymczasowego, jeśli rozmiar przesłanego pliku jest> 500kb. Jeśli jest mniejszy niż 500kb - użyje "BytesIO", które przechowuje zawartość pliku w pamięci, a jeśli jest więcej niż 500kb - przechowuje zawartość w TemporaryFile () (jak podano w dokumentacji werkzeug ). W obu przypadkach Twój skrypt będzie blokowany do momentu odebrania całego przesłanego pliku.
Najłatwiejszym sposobem obejścia tego, który znalazłem, jest:
1) Utwórz własną klasę IO podobną do pliku, w której będziesz przetwarzać wszystkie przychodzące dane
2) W swoim skrypcie zastąp klasę Request własną:
3) Zastąp request_class Flask swoim własnym:
4) Idź na piwo :)
źródło
Próbowałem zrobić dokładnie to samo, otworzyć plik tekstowy (właściwie CSV dla Pand). Nie chcę robić kopii, po prostu chcę ją otworzyć. Form-WTF ma ładną przeglądarkę plików, ale potem otwiera plik i tworzy plik tymczasowy, który przedstawia jako strumień pamięci. Przy odrobinie pracy pod maską,
źródło
Udostępniam swoje rozwiązanie (zakładając, że wszystko jest już skonfigurowane do łączenia się z wiadrem Google w kolbie)
Mój post
Bezpośrednio do Google Bucket w kolbie
źródło
Po prostu zrobiliśmy:
źródło
w działaniu
w pliku html
źródło
Na wypadek, gdybyśmy chcieli zrzucić plik w pamięci na dysk. Tego kodu można użyć
źródło