IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

encoding : je me tire les cheveux [Python 3.X]


Sujet :

Python

  1. #21
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 874
    Billets dans le blog
    1
    Par défaut
    J'adore ce site. Ils te vendent des montres à 10Millions € mais te rajoutent 931€ de frais de port
    Je trouve ça un peu exagéré. Sans ces frais pharamineux je leurs en aurais bien pris une petite dizaine pour offrir à mon jardinier et à ses adjoints...

    Sinon je vais examiner ton code plus en détail mais déjà une première remarque: tu n'as pas besoin de supprimer le fichier pour l'ouvrir ensuite en "a". Tu l'ouvres directement en "w" ça fait tout pareil.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  2. #22
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2023
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2023
    Messages : 33
    Par défaut
    On peut parler montre si tu veux, avec plaisir, j'adore mais clairement c'est abusé.
    A ce niveau c'est de toute façon de la spéculation car quand on pense que cela ne peut pas monter, ça monte encore ... Vive le capitalisme.
    Moi j'ai quelques montres automatiques mais je me fixe un prix maxi de 600€
    J'arrête là, ce n'est pas un forum de montres lolol

  3. #23
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 874
    Billets dans le blog
    1
    Par défaut
    Bon ben... je n'ai trouvé aucun souci d'encoding. Le code n'est pas excellent (surtout quand tu utilises "i" comme indice de page du site et aussi comme indice des annonces !!!) mais si on corrige ce genre de détail il se comporte parfaitement (sur un Linux). Nul besoin de préciser quoi que ce soit, le fichier de sortie est bien encodé en utf-8

    Ci-joint un truc un peu rectifié...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    #!/usr/bin/env python3
    # coding: utf-8
     
    import requests
    from bs4 import BeautifulSoup
    import datetime
    import time
     
    #permet de savoir combien de temps dure l'execution
    date = datetime.date.today()
    start = time.time()
     
    #met les titres de colonne dans le fichier csv qui est variable avec fstring sur la date
    #encodage en utf-8-sig qui marche bien, pourquoi ?
    dico = "§".join(
    	(
    		"Date",
    		"Marque",
    		"Descritpion",
    		"Prix",
    		"frais de port",
    		"Pays",
    	)
    )
    with open(f"{date}-donnéeschrono24.csv", "w") as fichier_extract:
    	print(dico, file=fichier_extract)
     
    #je boucle sur l'ensemble des pages. Attention, comment savoir en automatique combien il y a de pages ???
    #aujourd'hui obligé d'aller voir le nombre de pages qu'il y a sur le site internet
    page=1
    while True:
    	print("page={}".format(page))
    	url = "https://www.chrono24.fr/search/index.htm?accessoryTypes=&dosearch=true&query=montre&searchexplain=true&showpage={}&sortorder=11&watchTypes=U".format(page)
    	html = requests.get(url, headers={'User-Agent': 'Mozilla Firefox'})
    	soup = BeautifulSoup(html.content, 'html.parser')
    	#différentes annonces car toutes les infos ne se trouvent pas dans la même "div class"
    	annonces_texte = soup.find_all("div", {"class":"d-flex justify-content-between align-items-end m-b-1"})
     
    	# Fin de site ou limite
    	if not annonces_texte or page > 5: break
     
    	annonces_marque = soup.find_all("div", {"class":"p-x-2 p-x-sm-0"})
    	annonces_vrai_marque = soup.find_all("div", {"class":"article-item-container wt-search-result carousel-test"})
     
    	for (i, j, k) in zip(annonces_texte, annonces_marque, annonces_vrai_marque):
    		try:
    			prix = i.find("div", {"class":"text-bold"}).get_text()
    		except AttributeError:
    			prix = "no price"
     
    		try:
    			frais_port = i.find("div", {"class":"text-muted text-sm"}).get_text()
    		except AttributeError:
    			frais_port = "Pas de frais de port"
    		#marque generique ne marche pas, je n'arrive pas à la chopper dans data-manufacturer, exemple "Patek Philippe" 
    		marque_generique = k.find("a", {"data-manufacturer="})
    		marque = j.find("div", {"class":"text-bold text-ellipsis"}).get_text()
    		description = j.find("div", {"class":"text-ellipsis m-b-2"}).get_text()
    		pays = i.find("span", {"class":"text-sm text-uppercase"}).get_text()
     
    		#mets toutes les variables dans la liste. Obligé de mettre date et marque_generique en string ...
    		dico = "§".join(
    			(
    				str(date),
    				str(marque_generique),
    				marque.strip(),
    				description.strip(),
    				prix.strip(),
    				frais_port.strip(),
    				pays.strip(),
    			)
    		)
     
    		#toujours encoding utf-8-sig, pourquoi ?
    		# \n pour passage à la ligne
    		with open(f"{date}-donnéeschrono24.csv", "a") as fichier_extract:
    			print(dico, file=fichier_extract)
    	# for
    	page+=1
    # while
     
    # indique fin du temps pour durée d'execution
    end = time.time()
    print("Temps d'exécution : {}s".format(end - start))

    En ligne 93 du fichier généré j'ai une belle montre japonaise parfaitement décrite... 2023-05-06§None§Patek Philippe Nautilus§パテック・フィリップ ノーチラス5719/1G-001§714032*€§Livraison gratuite§JP ce qui me semble parfaitement limpide (moi qui lit couramment le japonais) ou au-moins parfaitement utf-8...

    Peut-être se pourrait-il que les soucis que tu crois avoir eus proviennent du fait que tu affiches ton fichier final dans un outil peut-être obsolète qui n'est pas capable de décoder l'utf-8 (exemple "notepad" de Windows) et qu'en réalité tu avais un fichier nickel dès le départ??? Ceci dit il y avait aussi ces str(dico) qui me titillaient (pourquoi forcer en str un truc qui est déjà str???)
    Donc je sais pas si tu as mis ça "par sécurité" ou "par obligation" mais dans les deux cas c'est mauvais (comme le cast à outrance en C). Si tu es obligé de mettre du str() alors que ta logique te dit "non" c'est le signe que tu as un souci à régler immédiatement (j'ai eu un exemple dans un de mes codes, le truc me disait "tu ne peux pas me foutre un tuple alors que j'attends une string" alors que j'étais persuadé que je lui passais une string. Mon premier réflexe a été str() mais je me suis retenu, je suis allé examiner mon code et j'ai vu une virgule mise par erreur => j'avais écrit qqchose ressemblant à var="...", au lieu de var="..." !!!)
    Et pour vérifier ton fichier, Notepad++ sait afficher l'utf-8.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #24
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 736
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 736
    Par défaut
    #je boucle sur l'ensemble des pages. Attention, comment savoir en automatique combien il y a de pages ???
    #aujourd'hui obligé d'aller voir le nombre de pages qu'il y a sur le site internet
    quand on atteint la dernière page, il n'y a plus de "button" "Continuer".

  5. #25
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 874
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    quand on atteint la dernière page, il n'y a plus de "button" "Continuer".
    Je m'en suis sorti en checkant le retour de soup.find_all(). S'il est vide c'est qu'on a dépassé la dernière page.
    Mais (pour info) des pages il y en a plus de 10000 (c'est pour ça que j'ai rajouté une limite).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #26
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2023
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2023
    Messages : 33
    Par défaut
    Sur le site il y a des montres qui arrivent qui partent et chaque jour le nombre de pages est différent ...
    Pour lancer mon execution, je vérifie le nombre de page qu'il y a et je change la boucle sur le programme mais je me demandais s'il n'y avait pas un moyen de detecter en automatique le nombre de pages ... You know what i mean ?
    Un truc du style while page exist ou un truc comme ça :o)

    Citation Envoyé par N_BaH Voir le message
    quand on atteint la dernière page, il n'y a plus de "button" "Continuer".

  7. #27
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2023
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2023
    Messages : 33
    Par défaut
    aucun soucis ...

    Code non excellent, je m'en doutais bien et c'est vrai que j'y ai pensé à cette variable i utilisée deux fois mais cela marchait alors ...

    Franchement, cela fait plaisir ...
    Niveau encoding, c'est le fameux utf-8-sig (et non utf-8)qui m'a permis d'avoir qq chose de propre et du japonais retranscrit et qui me permets alors de mieux séparer mes colonnes sur csv. Pour qui, pour quoi ? I do not know sachant que je n'utilise pas notepad, j'envoie direct sur csv qui va être mon fichier de travail pour faire des petites analyses via des TdC ...
    Donc, il doit bien y avoir qqch.
    Ce qui me fait plaisir, c'est que tu soulignes l'obligation de mettre le dico en str car je me suis posé exactement la même question et je n'ai clairement pas compris pourquoi j'étais obligé de faire cela sinon Python me disait qu'il y avait un problème et je n'ai pas, comme toi, cherché plus loin avec mes faibles connaissance.
    Figure toi que je viens de simuler à l'instant sans le str et ... Ca marche ... Strange, strange, strange mais ça marche :o)

    Maintenant, il faut que je regarde comment aller chercher une valeur dans une balise du site et je galère un peu car cela ne ressemble pas trop au get_text que j'utilise d'habitude car texte entre balise généralement. Mais je vais y arriver.

    Encore merci pour tout.

    Damien






    Citation Envoyé par Sve@r Voir le message
    Bon ben... je n'ai trouvé aucun souci d'encoding. Le code n'est pas excellent (surtout quand tu utilises "i" comme indice de page du site et aussi comme indice des annonces !!!) mais si on corrige ce genre de détail il se comporte parfaitement (sur un Linux). Nul besoin de préciser quoi que ce soit, le fichier de sortie est bien encodé en utf-8

    Ci-joint un truc un peu rectifié...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    #!/usr/bin/env python3
    # coding: utf-8
     
    import requests
    from bs4 import BeautifulSoup
    import datetime
    import time
     
    #permet de savoir combien de temps dure l'execution
    date = datetime.date.today()
    start = time.time()
     
    #met les titres de colonne dans le fichier csv qui est variable avec fstring sur la date
    #encodage en utf-8-sig qui marche bien, pourquoi ?
    dico = "§".join(
    	(
    		"Date",
    		"Marque",
    		"Descritpion",
    		"Prix",
    		"frais de port",
    		"Pays",
    	)
    )
    with open(f"{date}-donnéeschrono24.csv", "w") as fichier_extract:
    	print(dico, file=fichier_extract)
     
    #je boucle sur l'ensemble des pages. Attention, comment savoir en automatique combien il y a de pages ???
    #aujourd'hui obligé d'aller voir le nombre de pages qu'il y a sur le site internet
    page=1
    while True:
    	print("page={}".format(page))
    	url = "https://www.chrono24.fr/search/index.htm?accessoryTypes=&dosearch=true&query=montre&searchexplain=true&showpage={}&sortorder=11&watchTypes=U".format(page)
    	html = requests.get(url, headers={'User-Agent': 'Mozilla Firefox'})
    	soup = BeautifulSoup(html.content, 'html.parser')
    	#différentes annonces car toutes les infos ne se trouvent pas dans la même "div class"
    	annonces_texte = soup.find_all("div", {"class":"d-flex justify-content-between align-items-end m-b-1"})
     
    	# Fin de site ou limite
    	if not annonces_texte or page > 5: break
     
    	annonces_marque = soup.find_all("div", {"class":"p-x-2 p-x-sm-0"})
    	annonces_vrai_marque = soup.find_all("div", {"class":"article-item-container wt-search-result carousel-test"})
     
    	for (i, j, k) in zip(annonces_texte, annonces_marque, annonces_vrai_marque):
    		try:
    			prix = i.find("div", {"class":"text-bold"}).get_text()
    		except AttributeError:
    			prix = "no price"
     
    		try:
    			frais_port = i.find("div", {"class":"text-muted text-sm"}).get_text()
    		except AttributeError:
    			frais_port = "Pas de frais de port"
    		#marque generique ne marche pas, je n'arrive pas à la chopper dans data-manufacturer, exemple "Patek Philippe" 
    		marque_generique = k.find("a", {"data-manufacturer="})
    		marque = j.find("div", {"class":"text-bold text-ellipsis"}).get_text()
    		description = j.find("div", {"class":"text-ellipsis m-b-2"}).get_text()
    		pays = i.find("span", {"class":"text-sm text-uppercase"}).get_text()
     
    		#mets toutes les variables dans la liste. Obligé de mettre date et marque_generique en string ...
    		dico = "§".join(
    			(
    				str(date),
    				str(marque_generique),
    				marque.strip(),
    				description.strip(),
    				prix.strip(),
    				frais_port.strip(),
    				pays.strip(),
    			)
    		)
     
    		#toujours encoding utf-8-sig, pourquoi ?
    		# \n pour passage à la ligne
    		with open(f"{date}-donnéeschrono24.csv", "a") as fichier_extract:
    			print(dico, file=fichier_extract)
    	# for
    	page+=1
    # while
     
    # indique fin du temps pour durée d'execution
    end = time.time()
    print("Temps d'exécution : {}s".format(end - start))

    En ligne 93 du fichier généré j'ai une belle montre japonaise parfaitement décrite... 2023-05-06§None§Patek Philippe Nautilus§パテック・フィリップ ノーチラス5719/1G-001§714032*€§Livraison gratuite§JP ce qui me semble parfaitement limpide (moi qui lit couramment le japonais) ou au-moins parfaitement utf-8...

    Peut-être se pourrait-il que les soucis que tu crois avoir eus proviennent du fait que tu affiches ton fichier final dans un outil peut-être obsolète qui n'est pas capable de décoder l'utf-8 (exemple "notepad" de Windows) et qu'en réalité tu avais un fichier nickel dès le départ??? Ceci dit il y avait aussi ces str(dico) qui me titillaient (pourquoi forcer en str un truc qui est déjà str???)
    Donc je sais pas si tu as mis ça "par sécurité" ou "par obligation" mais dans les deux cas c'est mauvais (comme le cast à outrance en C). Si tu es obligé de mettre du str() alors que ta logique te dit "non" c'est le signe que tu as un souci à régler immédiatement (j'ai eu un exemple dans un de mes codes, le truc me disait "tu ne peux pas me foutre un tuple alors que j'attends une string" alors que j'étais persuadé que je lui passais une string. Mon premier réflexe a été str() mais je me suis retenu, je suis allé examiner mon code et j'ai vu une virgule mise par erreur => j'avais écrit qqchose ressemblant à var="...", au lieu de var="..." !!!)
    Et pour vérifier ton fichier, Notepad++ sait afficher l'utf-8.

  8. #28
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 736
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 736
    Par défaut
    petit point rédaction : on ne répond pas à un message avant de l'avoir lu,
    donc, on ne met pas la citation, à laquelle on fait référence, après son propre message.

  9. #29
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 874
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par damienvialla Voir le message
    c'est vrai que j'y ai pensé à cette variable i utilisée deux fois mais cela marchait alors ..
    Oh là là... quand wiztricks va voir cette justification...

    Citation Envoyé par damienvialla Voir le message
    Niveau encoding, c'est le fameux utf-8-sig (et non utf-8)qui m'a permis d'avoir qq chose de propre
    Nom : index.jpg
Affichages : 101
Taille : 32,1 Ko

    Citation Envoyé par damienvialla Voir le message
    Un truc du style while page exist ou un truc comme ça :o)
    Ben oui, c'est ce que j'ai expliqué (et codé): si annonces_texte = soup.find_all("div", {"class":"d-flex justify-content-between align-items-end m-b-1"}) est vide c'est qu'on a dépassé la dernière page.
    Après je suis allé au plus simple aussi (pas vraiment cherché s'il y avait plus fin)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #30
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2023
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2023
    Messages : 33
    Par défaut
    Yes, j'ai vu ce que tu as fait sur annonces_texte vide, c'est super bien trouvé ... Je cherche souvent des trucs compliqués alors qu'il existe des petits tricks comme cela pour lesquels je n'ai pas encore le reflexe.

    Pour ce qui est ma justification, je me doute bien que je vais me faire tapper sur les doigts car je vois que wiztricks est exigeant, et il a entièrement raison, mille fois.
    Mais malheureusement, je pars de tellement loin qu'il est difficile pour moi de faire plus d'efforts que j'en fais déjà.
    A pondre ce code, j'ai mis quasi 2 jours sachant que c'est de l'optimisation d'autres codes pour lesquels j'avais déjà mis des jours ... Sérieusement, j'y passe beaucoup de temps, parfois jusqu'à une heure du matin et je confesse que de temps en temps je vais à la solution de "facilité"

    Citation Envoyé par Sve@r Voir le message
    Oh là là... quand wiztricks va voir cette justification...


    Ben oui, c'est ce que j'ai expliqué (et codé): si annonces_texte = soup.find_all("div", {"class":"d-flex justify-content-between align-items-end m-b-1"}) est vide c'est qu'on a dépassé la dernière page.
    Après je suis allé au plus simple aussi (pas vraiment cherché s'il y avait plus fin)...

  11. #31
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 874
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par damienvialla Voir le message
    Pour ce qui est ma justification, je me doute bien que je vais me faire tapper sur les doigts
    Non, j'ai un peu exagéré car en réalité ça fonctionne pour de bon. Ta variable "i" a deux rôles différents mais pas en même temps et quand la boucle repart, la variable récupère la valeur suivante.
    Le souci c'est que quand j'ai remplacé le for par un while (en voulant voir jusqu'où ça allait) et qu'en fin de boucle j'ai écrit i+=1 là ça ne fonctionnait plus (le "i" avait pris la valeur de l'article et il n'y avait rien pour lui remettre la valeur de la page).
    Et là c'est plutôt une question de "ressenti". Même si ton for i in... fonctionne ça reste pas sain parce qu'un code doit être un minimum interchangeable : on doit pouvoir remplacer un for par un while et inversement sans devoir ensuite faire la revue de tout le corps de boucle. Et toujours pas sain car un code doit avoir un peu de souplesse : je peux avoir envie d'afficher "i" en fin de boucle ce qui n'est pas possible car à cet endroit, cette variable a perdu la signification que je veux afficher.
    Toutefois ok c'est pas sain... mais pas catastrophique. Ce qui est vraiment dangereux c'est cette fausse impression que utf-8-sig avait (a/aurait) résolu ton problème. Je pense plutôt qu'en réalité ça l'a juste masqué et qu'il serait revenu ensuite en pire. N'oublie pas la base: si tu ne connais pas la convention de codage (l'encoding) de ce que tu lis, tu ne peux pas le lire.
    Mais (à bien y réfléchir) c'est pareil dans la vie: si tu ne connais pas la grammaire, tu ne peux pas lire ce texte. Si tu ne connais pas le système sexagésimal (degré/minutes/secondes) tu ne peux pas positionner un navire (ou un avion) sur une carte. Et si tu n'as pas une oreille interne formée pour décoder les effets de compression/décompression de l'air tu ne peux pas écouter ce que quelqu'un te raconte.

    Citation Envoyé par damienvialla Voir le message
    Figure toi que je viens de simuler à l'instant sans le str et ... Ca marche ... Strange, strange, strange mais ça marche :o)
    Hé oui. Peut-être que tu as eu un souci au départ, que ton inexpérience concernant l'encoding t'a stressé encore plus (surtout que tu dois affronter l'encoding de ce que tu lis, l'encoding de comment tu vas l'écrire et aussi l'encoding de l'outil que tu utilises pour afficher ce que tu as écrit!!!), que tu es parti dans le mur et que tu t'es acharné à vouloir le traverser au lieu de te poser et calmement analyser ce qui pouvait se passer. On a tous vécu ce genre de situation (d'ailleurs parfois je la vis encore)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #32
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2023
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2023
    Messages : 33
    Par défaut
    Salut Sve@r,

    Merci de m'avoir sorti de ma zone de confort, je me suis renseigné sur les encodages avec ascii, puis utf8 qui code sur plusieurs octets en fonction des premiers bits, c'était super intéressant.
    J'ai donc cherché un peu plus finement mon problème est sans avoir tout résolu sur la façon de bien lire pour bien comprendre et traduire, j'ai trouvé quelque chose d'intéressant sur excel qui me permet d'avoir les bons caractères sans passer par utf-8-sig mais toujours avec une petit incompréhension.
    Dans mon code, j'encode en utf8 et ensuite excel me mettait des caractères chelou ce qui posait problème.
    1e solution infructueuse : "enregistrer sous" mon fichier avec "outils/option web/utf8"
    2e solution qui marche : "données/obtenir des données/à partir fichier csv", importer le fichier csv et choisir utf8 (65001)

    Voilà, c'était pour tenir au courant des avancées ...
    Et encore merci.

    Citation Envoyé par Sve@r Voir le message
    Non, j'ai un peu exagéré car en réalité ça fonctionne pour de bon. Ta variable "i" a deux rôles différents mais pas en même temps et quand la boucle repart, la variable récupère la valeur suivante.
    Le souci c'est que quand j'ai remplacé le for par un while (en voulant voir jusqu'où ça allait) et qu'en fin de boucle j'ai écrit i+=1 là ça ne fonctionnait plus (le "i" avait pris la valeur de l'article et il n'y avait rien pour lui remettre la valeur de la page).
    Et là c'est plutôt une question de "ressenti". Même si ton for i in... fonctionne ça reste pas sain parce qu'un code doit être un minimum interchangeable : on doit pouvoir remplacer un for par un while et inversement sans devoir ensuite faire la revue de tout le corps de boucle. Et toujours pas sain car un code doit avoir un peu de souplesse : je peux avoir envie d'afficher "i" en fin de boucle ce qui n'est pas possible car à cet endroit, cette variable a perdu la signification que je veux afficher.
    Toutefois ok c'est pas sain... mais pas catastrophique. Ce qui est vraiment dangereux c'est cette fausse impression que utf-8-sig avait (a/aurait) résolu ton problème. Je pense plutôt qu'en réalité ça l'a juste masqué et qu'il serait revenu ensuite en pire. N'oublie pas la base: si tu ne connais pas la convention de codage (l'encoding) de ce que tu lis, tu ne peux pas le lire.
    Mais (à bien y réfléchir) c'est pareil dans la vie: si tu ne connais pas la grammaire, tu ne peux pas lire ce texte. Si tu ne connais pas le système sexagésimal (degré/minutes/secondes) tu ne peux pas positionner un navire (ou un avion) sur une carte. Et si tu n'as pas une oreille interne formée pour décoder les effets de compression/décompression de l'air tu ne peux pas écouter ce que quelqu'un te raconte.


    Hé oui. Peut-être que tu as eu un souci au départ, que ton inexpérience concernant l'encoding t'a stressé encore plus (surtout que tu dois affronter l'encoding de ce que tu lis, l'encoding de comment tu vas l'écrire et aussi l'encoding de l'outil que tu utilises pour afficher ce que tu as écrit!!!), que tu es parti dans le mur et que tu t'es acharné à vouloir le traverser au lieu de te poser et calmement analyser ce qui pouvait se passer. On a tous vécu ce genre de situation (d'ailleurs parfois je la vis encore)...

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. HTML encode UTF-8 et les accents
    Par Spir dans le forum Langage
    Réponses: 7
    Dernier message: 28/12/2008, 22h03
  2. Réponses: 3
    Dernier message: 06/09/2008, 02h18
  3. Couper les cheveux en 4
    Par kaukau dans le forum Haskell
    Réponses: 9
    Dernier message: 27/02/2008, 13h34
  4. X forwarding tiré par les cheveux
    Par Eusebius dans le forum Réseau
    Réponses: 32
    Dernier message: 16/06/2006, 11h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo