J'espérais que quelqu'un pourrait m'aider avec ça. Je reçois un fichier à partir d'un formulaire dans Django, ce fichier est un csv et j'essaye de le lire avec la bibliothèque Python csv . Le problème ici est que lorsque j'applique la fonction csv.reader et que je transforme ce résultat en liste pour l'imprimer, je découvre que csv.reader n'est pas diviser correctement mon fichier. Voici quelques images pour illustrer le problème
Et voici la valeur imprimée de la variable file_readed :
Comme vous pouvez le voir sur l'image, il semble diviser mon fichier caractère par caractère à quelques exceptions près. Je vous remercie de toute aide que vous pouvez me fournir.
4 Réponses :
que CSV ne semble pas correct: vous avez des lignes avec plus d'arguments que d'autres.
L'acronyme de CSV étant Valeurs séparées par des virgules, vous devez avoir exactement les mêmes arguments séparés par des virgules pour chaque ligne, sinon cela va tout gâcher.
Je vois dans vos lignes que vous vous attendez peut-être à avoir 3 colonnes, à la place vous avez des lignes avec 2 ou 4 arguments, et certaines d'entre elles ont une ouverture " dans un argument, une virgule, puis en fermant " dans le deuxième argument
vérifier si votre script fonctionne avec d'autres CSV peut-être
Je lisais ce csv manuellement et en utilisant la fonction split, le problème était ces colonnes avec l'ouverture ". J'ai cherché et j'ai découvert que le lecteur csv diviserait correctement ces colonnes. En ce qui concerne les colonnes vides, je ont travaillé avec csv qui avait des colonnes vides et cela a parfaitement fonctionné.
qu'en est-il de ceux qui débordent?
Vous devrez probablement spécifier un délimiteur. Comme vous n'avez pas explicitement parlé du délimiteur, je suppose que c'est confus.
csv.reader(csvfile, delimiter=',')
Cependant, comme il y a des guillemets avec un délimiteur de virgule, vous devrez peut-être modifier le délimiteur par défaut lors de la création du fichier CSV aussi pour l'onglet ou autre chose.
J'ai déjà essayé de spécifier le délimiteur et cela n'a pas fonctionné.
Je suppose que vous devez modifier le délimiteur lors de la création du fichier en changeant le délimiteur par défaut en point-virgule ou en tabulation. Ensuite, il pourra lire. Parce que vous avez plus de virgules que 2 sur la 3ème ligne du CSV.
Le problème est ici:
import pandas as pd file_readed = pd.read_csv(file_csv) print(file_readed)
'list' provoque l'impression de chaque élément dans le csv en tant qu'unité individuelle.
Essayez plutôt ceci:
with open('carga_cie10') as f:
reader = csv.reader(f)
for row in reader:
print(" ".join(row))
Modifier:
print(list(file_readed))
La sortie doit avoir l'air propre. Pandas est très utile dans les situations où les données doivent être lues, manipulées, modifiées, etc.
Le fait est que je n'ai pas physiquement le fichier, je reçois directement du formulaire, donc je n'ai pas pu ouvrir le fichier comme ça.
Modification pour suggérer d'utiliser Pandas à la place.
Si vous tirez d'un formulaire Web, essayez d'obtenir le csv sous forme de chaîne, confirmez dans un outil d'impression ou de débogage que le résultat est correct, puis transmettez-le à csv à l'aide de StringIO.
from io import StringIO
import csv
csv_string = form.files['carga_cie10'].file_read().decode(encoding="ISO-88590-1")
csv_file = StringIO(csv_string)
reader = csv.reader(csvfile, delimiter=',', quotechar='"')
for row in reader:
print(row)
Une autre chose que vous pouvez essayer est de changer l'argument lineterminator en csv.reader () . Il peut être par défaut \ r \ n mais le formulaire Web peut utiliser une autre valeur. Inspectez la chaîne que vous obtenez du formulaire Web pour confirmer.
J'ai mal lu votre question. Pouvez-vous essayer d'obtenir une chaîne du formulaire Web et voir si cela vous semble correct?
Merci, mon frère, cela a parfaitement fonctionné pour moi et ça divise tout correctement. Tu as vraiment sauvé ma journée!
Pouvez-vous s'il vous plaît mettre votre code et vos données dans des blocs de code? meta.stackexchange.com / questions / 22186 /…