dans un tuto, on nous montre comment séparer les éléments d'une ligne, et notamment le nom entre guillemets qui est séparé par une virgule.
mais je ne comprends pas un truc, le nom entre guillemets est censé ne faire "qu ' un ", alors que j'ai l'impression qu'ici on le sépare :
Voilà le code :
la ligne à couper : "La Jolla Bank, FSB",La Jolla,CA,32423,19-Feb-10,24-Feb-10
def mysplit (string):
quote = False
retval = []
current = ""
for char in string:
if char == '"':
quote = not quote //est-ce léquivalent de quote = !quote, donc quote = true?
elif char == ',' and not quote:
retval.append(current)
current = "" //si on vide current, on sépare le nom entre guillemets, non?
else:
current += char
retval.append(current)
return retval
on se sert de ce code pour cibler les dates, en "4" et en "5" :
# Read lines from file, skipping first line
data = open("banklist.csv", "r").readlines()[1:]
for entry in data:
# Parse values
vals = mysplit(entry.strip())
# Convert dates to sqlite3 standard format
vals[4] = datetime.strptime(vals[4], "%d-%b-%y")
vals[5] = datetime.strptime(vals[5], "%d-%b-%y")
en fait, on est censé découper la ligne avec le séparateur "virgule", mais ce qui se trouve entre guillemets doit être considéré comme un nom, et non deux, pour que quand on récupère chaque ligne, on trouve en position 4 et 5 les dates à la fin de la ligne (si j'ai bien compris) : je remet la ligne à couper :
Citation
"La Jolla Bank, FSB",La Jolla,CA,32423,19-Feb-10,24-Feb-10
donc je suis un peu brouillé par le "not quote" : quand on tombe sur le premier guillemet, on met "not quote" à quote qui est déjà à false. et ensuite on vérifie qu'on est à "not quote" et si on tombe sur une virgule on met le mot dans le tableau. Donc j'ai l'impression qu'on coup aussi le mot entre guillements. (ce qui n'est au final apparemment pas le cas, car le code vient du tuto, ce n'est pas moi qui l'ai écrit) Tu vois ce que je veux dire?
Si quote vaut True alors notquote vaut False, et inversement. Dans le code cité ci-dessus, quote est utilisé comme un interrupteur; un coup il est défini comme vrai quand le caractère courant est un guillemet puis faux au suivant. Ainsi de suite. C'est pas plus compliqué que ça.
salut, oui j'imagine bien que c'est ça, mais c'est dans la condition que je m'y perds un peu :
if char == '"':
quote = not quote
elif char == ',' and not quote:
retval.append(current)
current = "" #si on vide current, on sépare le nom entre guillemets, non?
else:
current += char
"and not quote" ici veut dire "and quote == false"?
dans ce cas, on saute le elif et on va directement au else sans vider current donc sans couper le mot.
Mais j'ai l'impression de lire "and not quote" comme "and l'inverse quote" qui est à false lorsqu'il est déclaré, donc quote == true,
et la condition est remplie (la virgule + quote à true) et on coupe le mot en vidant current...
(or, une fois qu'on a passé le premier guillemet, on ne doit pas couper les mots entre virgules)
Y'a effectivement une manière bien plus simple d'arriver à ton résultat comme viens de le préciser josmiley. Si tu tiens à le coder toi-même alors je vais essayer de détaillé ton code pour t'éclairer :
def mysplit(string):
quote = False
retval = []
current = ""
for char in string:
if char == '"':
quote = not quote #ici cette ligne rend quote égal à son inverse
#si quote vaut vrai, not quote vaut faux
#sinon si quote vaut faux, not quote vaut vrai
#résultat : quote = True jusqu'à la prochaine occurence de '"' dans
#string
elif char == ',' and not quote:
#la c'est de la logique :
#vrai et vrai => vrai
#faux et vrai => faux
#vrai et faux => faux
#faux et faux => faux
#ici quote = False (ou est dans le ELIF, pas dans le IF)
#donc : not quote = True, a moins que l'on ai rencontrer un '"' !
#si tu veux capturer ce qui est entre '"' alors mets and quote
retval.append(current) #la pas de soucie
current = ""
else:
current += char
retval.append(current)
return retval
Voila j’espère que ces petites explications te serons utiles.
Dans ce cas précis, ça n'a sûrement pas d'importance, mais algorithmiquement parlant la fonction mysplit est plus optimisé que l'utilisation de la méthode split deux fois de suite (sans parler du slicing qui fait une copie de la liste à chaque fois).
edit: bon, simplement pour dire que je comprends le principe du code, mais "and not quote" voudrait plutôt dire false, donc le elif devrait correspondre à quote == false pour ne pas couper le mot tant que quote n'est pas revenu à false dans le "if", mais c'était un peu flou pour moi, je pensais que "and not quote" voulait dire "l'inverse de quote" , alors que ça veut seulement dire "quote doit être à false".
bref, merci pour vos réponses
question débutant : séparer une ligne
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Python c'est bon, mangez-en.