Pas capable d'analyser une .csv fichier téléchargé à l'aide de Fiole
Je suis en train de télécharger un fichier CSV, le travail pour produire des résultats, et écrire de nouveau (télécharger) un nouveau fichier CSV contenant le résultat.
Je suis très nouveau pour Flacon et je ne suis pas en mesure d'obtenir un "bon" csv.reader
objet d'itérer et de travail.
Voici le code jusqu'à présent,
__author__ = 'shivendra'
from flask import Flask, make_response, request
import csv
app = Flask(__name__)
def transform(text_file_contents):
return text_file_contents.replace("=", ",")
@app.route('/')
def form():
return """
<html>
<body>
<h1>Transform a file demo</h1>
<form action="/transform" method="post" enctype="multipart/form-data">
<input type="file" name="data_file" />
<input type="submit" />
</form>
</body>
</html>
"""
@app.route('/transform', methods=["POST"])
def transform_view():
file = request.files['data_file']
if not file:
return "No file"
file_contents = file.stream.read().decode("utf-8")
csv_input = csv.reader(file_contents)
print(file_contents)
print(type(file_contents))
print(csv_input)
for row in csv_input:
print(row)
result = transform(file_contents)
response = make_response(result)
response.headers["Content-Disposition"] = "attachment; filename=result.csv"
return response
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5001, debug=True)
Le terminal de la sortie d'
127.0.0.1 - - [12/Oct/2015 02:51:53] "GET /HTTP/1.1" 200 -
127.0.0.1 - - [12/Oct/2015 02:51:59] "POST /transform HTTP/1.1" 200 -
4,5,6
<class 'str'>
<_csv.reader object at 0x105149438>
['1']
['', '']
['2']
['', '']
['3']
[]
['4']
['', '']
['5']
['', '']
['6']
Alors que le fichier que j'ai lu est
Ce que je fais mal à pas faire 2 listes représentant 2 lignes quand je itérer le csv.objet de lecteur?
Pourriez-vous montrer ce que votre fichier csv ressemble dans un format texte et non pas dans un programme de feuille de calcul. Aussi ce programme de feuille de calcul vous utilisez pour générer le fichier csv (le cas échéant). Et encore une chose, pourquoi est-il nécessaire de remplacer
Remplacement de
Ajouté le texte de l'image du fichier au format csv.
Mise en forme dans les commentaires sur ce site est étrange. C'est qu'un retour à la ligne entre le 3 et le 4? Par les résultats de l'itération par le biais de votre csv, il semblerait qu'il y est un retour chariot
Oui, c'est étrange. J'ai téléchargé le fichier dropbox.com/s/xmgn8n3o9leor12/blog1.csv?dl=0
=
avec ,
? La plupart des csv dialectes ne pas utiliser le signe "égal".Remplacement de
=
avec ,
est complètement inutile. Transformer est un mannequin de fonction pour le moment. Mais je ne pouvais pas arriver jusqu'à là-bas comme je suis coincé à l'csv lecture de la première partie.Ajouté le texte de l'image du fichier au format csv.
Mise en forme dans les commentaires sur ce site est étrange. C'est qu'un retour à la ligne entre le 3 et le 4? Par les résultats de l'itération par le biais de votre csv, il semblerait qu'il y est un retour chariot
\r
ou un saut de ligne \n
après chaque numéro, mais si ce n'est pas le cas, j'aurais besoin d'une copie du fichier csv de jouer avec lui, afin de le comprendreOui, c'est étrange. J'ai téléchargé le fichier dropbox.com/s/xmgn8n3o9leor12/blog1.csv?dl=0
OriginalL'auteur Shivendra | 2015-10-11
Vous devez vous connecter pour publier un commentaire.
OK, donc il y a un problème majeur avec votre script,
csv.reader
comme indiqué ici attend un fichier objet ou d'au moins un objet qui prend en charge l'itérateur protocole. Vous êtes de passage à unstr
qui n'mettre en œuvre l'itérateur protocole, mais au lieu d'itération à travers les lignes, il parcourt les personnages. C'est pourquoi vous avez la sortie que vous faites.Tout d'abord, il donne un seul caractère
1
qui lecsv.reader
voit comme une ligne avec un seul champ. Après que lestr
donne un autre caractère unique,
qui lecsv.reader
voit comme une ligne avec deux champs vides (car la virgule est le champ séparateur). Il en va ainsi tout au long de lastr
jusqu'à ce qu'il est épuisé.La solution (ou au moins une solution) est de faire de la
str
dans un fichier objet semblable. J'ai essayé d'utiliser le flux de données fournies parflask.request.files["name"]
, mais qui n'a pas d'itérer à travers les lignes. Ensuite, j'ai essayé d'utiliser uncStringIO.StringIO
et qui semblait avoir un problème similaire. Je me suis retrouvé à cette question, qui a proposé uneio.StringIO
objet universelle des retours à la ligne mode qui a fonctionné. J'ai fini avec le travail suivants du code (il pourrait peut-être mieux):Yup, je vous remercie pour votre réponse détaillée. Pas facile de trouver une réponse sur le web. Vous l'avez fait 😉
OriginalL'auteur iLoveTux