Lire les données du fichier sans l'enregistrer dans le Flacon
Je suis en train d'écrire mon premier flacon d'application. Je suis de l'upload de fichiers, et fondamentalement, ce que je veux, c'est de lire les données/contenu du fichier téléchargé sans l'enregistrer et de l'imprimer sur la page de résultat. Oui, je suis en supposant que l'utilisateur télécharge un fichier texte toujours.
Ici est la simple fonction de téléchargement, je suis en utilisant:
@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)
Maintenant, je suis d'enregistrer le fichier, mais ce dont j'ai besoin est que la variable 'a' pour contenir le contenu/données du fichier .. des idées?
Vous devez vous connecter pour publier un commentaire.
FileStorage
contientstream
champ. Cet objet doit s'étendre IO ou d'un fichier objet, de sorte qu'il doit contenirread
et d'autres méthodes similaires.FileStorage
également étendrestream
champ des attributs d'un objet, de sorte que vous pouvez simplement utiliserfile.read()
au lieufile.stream.read()
. Vous pouvez également utilisersave
argument avecdst
paramètre commeStringIO
ou d'autres IO ou d'un fichier objet à copierFileStorage.stream
à l'autre IO ou d'un fichier objet.Voir la documentation: http://flask.pocoo.org/docs/api/#flask.Request.files et http://werkzeug.pocoo.org/docs/datastructures/#werkzeug.datastructures.FileStorage.
file = request.files.get('file')
filetype = magic.from_buffer(file.read(1024))
f.read()
travaille ensuite à l'aide du code ci-dessus. quand estprint f.read()
je obtenir de bons à la recherche d'ordure dans le terminal. Espérons que cela aide.mystring = TextIOWrapper(binary_stream)
f.read()
n'a pas donné quelque chose pour moi aussi. Convocation de la premièref.seek(0)
a fait le tour pour moi.from werkzeug.datastructures import FileStorage; FileStorage(request.stream).save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
. Travail bien! +1Si vous souhaitez utiliser la norme Flacon de choses - il n'y a aucun moyen d'éviter l'enregistrement d'un fichier temporaire si le téléchargement de la taille du fichier est > 500kb. Si elle est plus petite que 500kb - il utiliser "BytesIO", qui stocke le contenu d'un fichier en mémoire, et si c'est plus que 500kb - il stocke le contenu dans TemporaryFile() (comme indiqué dans le werkzeug documentation). Dans les deux cas, votre script sera bloqué jusqu'à ce que l'intégralité du fichier téléchargé est reçu.
La façon la plus simple de contourner ce que j'ai trouvé est:
1) Créer votre propre fichier-comme IO classe où vous faire tout le traitement des données entrantes
2) Dans votre script, déroger à la Demande de la classe avec votre propre:
3) Remplacer le Flacon de request_class avec votre propre:
4) Aller boire une bière 🙂
Dans le cas où nous voulons faire un dump de la mémoire de fichier sur le disque. Ce code peut être utilisé