Projet

Général

Profil

Development #41612

csvdatasource: ne pas faire .splitlines() sur le contenu du CSV

Ajouté par Benjamin Dauvergne il y a environ 4 ans. Mis à jour il y a plus de 3 ans.

Statut:
Rejeté
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
10 avril 2020
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Les fichiers CSV contenant des sauts de ligne les perdent (tester par exemple :

id,text,comment
1,a,"un
long
texte" 
2,a,b

parce que le fichier est parsé de cette manière :

            reader = csv.reader(content.splitlines(), **self.dialect_options)

et str.splitlines supprime les sauts de ligne de chaque ligne (contrairement à open(..).readlines()).


Fichiers

Historique

#1

Mis à jour par Benjamin Dauvergne il y a environ 4 ans

  • Tracker changé de Support à Bug
#3

Mis à jour par Benjamin Dauvergne il y a environ 4 ans

  • Assigné à mis à Benjamin Dauvergne
#4

Mis à jour par Benjamin Dauvergne il y a environ 4 ans

#5

Mis à jour par Benjamin Dauvergne il y a environ 4 ans

  • Statut changé de Solution proposée à En cours

Et donc personne n'avait jamais vu le problème parce que personne n'a réussi à faire avaler un fichier CSV avec des sauts de ligne, le sniffer en 2.7.13 n'y arrive pas (sur ma machine en 2.7.16 ça marche très bien).

https://github.com/python/cpython/blob/2.7/Misc/NEWS.d/2.7.15rc1.rst

Fixed guessing quote and delimiter in csv.Sniffer.sniff() when only the last field is quoted. Patch by Jake Davis.
#6

Mis à jour par Benjamin Dauvergne il y a environ 4 ans

  • Statut changé de En cours à Solution proposée

Bon ben voilà, en rajoutant une colonne ça passe.

#7

Mis à jour par Benjamin Dauvergne il y a environ 4 ans

Le changement est assez minime entre 2.7.13 et 2.7.16 :

$ diff -ub /tmp/csv.py /usr/lib/python2.7/csv.py
--- /tmp/csv.py    2020-04-11 12:37:50.081188000 +0200
+++ /usr/lib/python2.7/csv.py    2019-09-04 10:19:57.000000000 +0200
@@ -217,7 +217,7 @@
         matches = []
         for restr in ('(?P<delim>[^\w\n"\'])(?P<space> ?)(?P<quote>["\']).*?(?P=quote)(?P=delim)', # ,".*?",
                       '(?:^|\n)(?P<quote>["\']).*?(?P=quote)(?P<delim>[^\w\n"\'])(?P<space> ?)',   #  ".*?",
-                      '(?P<delim>>[^\w\n"\'])(?P<space> ?)(?P<quote>["\']).*?(?P=quote)(?:$|\n)',  # ,".*?" 
+                      '(?P<delim>[^\w\n"\'])(?P<space> ?)(?P<quote>["\']).*?(?P=quote)(?:$|\n)',   # ,".*?" 
                       '(?:^|\n)(?P<quote>["\']).*?(?P=quote)(?:$|\n)'):                            #  ".*?" (no delim, no space)
             regexp = re.compile(restr, re.DOTALL | re.MULTILINE)
             matches = regexp.findall(data)

J'ai bien envie de la backporter manuellement.

#9

Mis à jour par Benjamin Dauvergne il y a plus de 3 ans

  • Statut changé de Solution proposée à Rejeté

De toute façon ça ne marchera jamais bien, il faut un formulaire explicite de définition des paramètres du CSV, il n'existe pas d'autre moyen (Sniffer est capable de prendre les espaces pour des séparateurs sur un CSV suffisamment compliqué).

Formats disponibles : Atom PDF