Bonjour je souhaite faire correspondre plusieurs lignes situé sur une colonne pour les mettre sur deux colonnes et les lignes qui correspondent pas seront supprimé tout cela en python et les lignes sont situé dans un fichier texte.
Je débute en python pourriez vous me dire comment je dois procéder ?
Le principe de base, c'est se demander comment moi, avec mes "doigts", je procéderai. Par exemple, ce qui vient "naturellement":
1-ouvrir le fichier
2-lire le fichier et récupérer les lignes dans une liste All
3-on peut fermer le fichier
4-Séparer ma liste selon que la ligne contient ou non la chaine "EXT_" (si la ligne contient "EXT_", je la mets dans une liste ListeExt, sinon je la mets dans une liste listeNormale)
5-Je parcours ListeExt et je regarde si le mot qui suit EXT_ est présent dans la listeNormale; si oui, j'ajoute les éléments dans ListeFinale
6-j'écris ListeFinale dans mon fichier de sortie.
Après, en regardant de plus près, je vois que les noms sont en majuscule ou pas (donc, je vais devoir mettre mes chaines en minuscule ou en majuscule pour pouvoir les comparer); que pour la noix de cajou, j'ai d'un côté NOIX-CAJOU et de l'autre NOIX_CAJOU, donc il va aussi falloir que je fasse quelque chose pour gérer ça.
Enfin (ou plutôt ce que j'aurai dû/pu me demander en premier), c'est d'où sont issus ces informations ? Si ça vient d'une base de données, est-ce que je ne peux pas avoir directement le bon format de sortie avec une requête SQL (ou autre), et du coup, corriger dans cette base les points observés juste au dessus (minuscule/majuscule et le cas de NOIX_CAJOU/NOIX-CAJOU et autres si il y en a).
Bonjour je souhaite faire correspondre plusieurs lignes situé sur une colonne pour les mettre sur deux colonnes et les lignes qui correspondent pas seront supprimé tout cela en python et les lignes sont situé dans un fichier texte.
Je débute en python pourriez vous me dire comment je dois procéder ?
Le principe de base, c'est se demander comment moi, avec mes "doigts", je procéderai. Par exemple, ce qui vient "naturellement":
1-ouvrir le fichier
2-lire le fichier et récupérer les lignes dans une liste All
3-on peut fermer le fichier
4-Séparer ma liste selon que la ligne contient ou non la chaine "EXT_" (si la ligne contient "EXT_", je la mets dans une liste ListeExt, sinon je la mets dans une liste listeNormale)
5-Je parcours ListeExt et je regarde si le mot qui suit EXT_ est présent dans la listeNormale; si oui, j'ajoute les éléments dans ListeFinale
6-j'écris ListeFinale dans mon fichier de sortie.
Après, en regardant de plus près, je vois que les noms sont en majuscule ou pas (donc, je vais devoir mettre mes chaines en minuscule ou en majuscule pour pouvoir les comparer); que pour la noix de cajou, j'ai d'un côté NOIX-CAJOU et de l'autre NOIX_CAJOU, donc il va aussi falloir que je fasse quelque chose pour gérer ça.
Enfin (ou plutôt ce que j'aurai dû/pu me demander en premier), c'est d'où sont issus ces informations ? Si ça vient d'une base de données, est-ce que je ne peux pas avoir directement le bon format de sortie avec une requête SQL (ou autre), et du coup, corriger dans cette base les points observés juste au dessus (minuscule/majuscule et le cas de NOIX_CAJOU/NOIX-CAJOU et autres si il y en a).
Bonjour ce sont les étapes 4, 5 et 6 qui me pose problème je ne sais pas comment écrire cela en python ?
Ces infos sont seulement issues d'un fichier texte pas de SQL ni de base de données.
ListeFinale=[]
for i in range(len(ListeExt)):
texteATrouver=ListeExt[i].split('EXT_',maxsplit=1)[1].lower()
for texte in listeNormale:
if texteATrouver == texte.split(maxsplit=1)[1].lower():
ListeFinale.append(ListeExt[i])
break
la ligne 3 sépare le texte '3 EXT_BANANE' en liste de 2 (maxsplit+1) éléments dont le séparateur est 'EXT_' ce qui donne ['3 ','BANANE'], donc on prend l'élément 1 de cette liste qui est 'BANANE' et le passe en minuscule
la ligne 5 fait une opération de même style sur '2 Banane' (2 éléments avec séparateur un whitespace (pour faire simple on dira tout espace) ce qui donne ['2','Banane'] et on passe ce 'Banane' en minuscule pour pouvoir le comparer au 'banane' issu de la ligne 3
le break permet de sortir de la boucle de la ligne 4 quand on a trouvé une correspondance.
Ne pas oublie le cas NOIX_CAJOU/NOIX-CAJOU si ce n'est pas une erreur de copier/coller.
ListeFinale=[]
for i in range(len(ListeExt)):
texteATrouver=ListeExt[i].split('EXT_',maxsplit=1)[1].lower()
for texte in listeNormale:
if texteATrouver == texte.split(maxsplit=1)[1].lower():
ListeFinale.append(ListeExt[i])
break
la ligne 3 sépare le texte '3 EXT_BANANE' en liste de 2 (maxsplit+1) éléments dont le séparateur est 'EXT_' ce qui donne ['3 ','BANANE'], donc on prend l'élément 1 de cette liste qui est 'BANANE' et le passe en minuscule
la ligne 5 fait une opération de même style sur '2 Banane' (2 éléments avec séparateur un whitespace (pour faire simple on dira tout espace) ce qui donne ['2','Banane'] et on passe ce 'Banane' en minuscule pour pouvoir le comparer au 'banane' issu de la ligne 3
le break permet de sortir de la boucle de la ligne 4 quand on a trouvé une correspondance.
Ne pas oublie le cas NOIX_CAJOU/NOIX-CAJOU si ce n'est pas une erreur de copier/coller.
Le cas NOIX_CAJOU/NOIX-CAJOU n'est pas une erreur,l'étape 6 pour mettre ce qu'il y a dans le tableau finale et l'écrire dans le fichier j'écris cela comment en python ? J'ai essayé cela mais j'ai une erreur " texteATrouver=ListeExt[i].split('EXT_',maxsplit=1)[1].lower()
IndexError: list index out of range
"
mon code:
with open("test.txt", "r") as f1:
ListeExt=f1.readlines()
listeNormale=f1.readlines()
ListeFinale=[]
for i in range(len(ListeExt)):
texteATrouver=ListeExt[i].split('EXT_',maxsplit=1)[1].lower()
for texte in listeNormale:
if texteATrouver == texte.split(maxsplit=1)[1].lower():
ListeFinale.append(ListeExt[i])
break
with open('test.txt', 'w') as f2:
f2.writelines(ListeFinale)
je n'ai mis que l'étape 5 de ce que j'avais décrit, il faut passer par l'étape 4 avant, soit le code écrit par Phil_1857. l'erreur vient du fait que tu traites toutes les chaines du fichier et tu cherches l'élément après la chaine "EXT_" et comme cette chaine n'est pas sur toutes les lignes, erreurs sur celles qui n'ont pas cette chaine.
Pour moi, le cas NOIX-CAJOU/NOIX_CAJOU est un problème de cohérence des données, après, on peut utiliser un replace lors de la comparaison
if texteATrouver.replace("-","_") == texte.split(maxsplit=1)[1].lower().replace("-","_")
je n'ai mis que l'étape 5 de ce que j'avais décrit, il faut passer par l'étape 4 avant, soit le code écrit par Phil_1857. l'erreur vient du fait que tu traites toutes les chaines du fichier et tu cherches l'élément après la chaine "EXT_" et comme cette chaine n'est pas sur toutes les lignes, erreurs sur celles qui n'ont pas cette chaine.
Pour moi, le cas NOIX-CAJOU/NOIX_CAJOU est un problème de cohérence des données, après, on peut utiliser un replace lors de la comparaison
if texteATrouver.replace("-","_") == texte.split(maxsplit=1)[1].lower().replace("-","_")
Je viens de modifier mon code en rajoutant l'étape 4, le souci alors il n'y a pas derreur mais le fichier il y a plus rien dedans
mon code
with open("test.txt", "r") as f1:
ligne=f1.readlines()
ListeExt, listeNormale = [], []
if('EXT' in ligne):
ListeExt.append(ligne)
else:
listeNormale.append(ligne)
ListeFinale=[]
for i in range(len(ListeExt)):
texteATrouver=ListeExt[i].split('EXT_',maxsplit=1)[1].lower()
for texte in listeNormale:
if texteATrouver == texte.split(maxsplit=1)[1].lower():
ListeFinale.append(ListeExt[i])
break
with open('test.txt', 'w') as f2:
f2.writelines(ListeFinale)
Et je ne veux pas remplacer les "-" et les "_" pour le cas Noix de cajou j'aimerai les laisser comme tel mais oui seulement les modifier lors de la comparaison
tu as mal ajouté le code de l'étape 4, Phil_1857 a bien précisé que ligne est un élément de la liste contenant les lignes des fichiers. Or dans ton code, ligne est la liste contenant les lignes ligne[0] est la 1ère ligne du fichier, ... Donc il faut parcourir cette liste et sur chacune des lignes faire le test.
Le replace que j'ai indiqué permet de tester les 2 lignes avec le même symbole séparateur, sinon, les 2 valeurs seront différentes, au final, le texte ne sera pas remplacer.
Tu peux faire des essais dans l'interpréteur python pour voir ce que fait chaque étape.
tu as mal ajouté le code de l'étape 4, Phil_1857 a bien précisé que ligne est un élément de la liste contenant les lignes des fichiers. Or dans ton code, ligne est la liste contenant les lignes ligne[0] est la 1ère ligne du fichier, ... Donc il faut parcourir cette liste et sur chacune des lignes faire le test.
Le replace que j'ai indiqué permet de tester les 2 lignes avec le même symbole séparateur, sinon, les 2 valeurs seront différentes, au final, le texte ne sera pas remplacer.
Tu peux faire des essais dans l'interpréteur python pour voir ce que fait chaque étape.
ligne étant un élément de la liste à parcourir qui contient tout le fichier
Le Soucis c'est que quand j'exécute le code tel quel de l'étape 4 je ne rentre jamais dans le if mais seulement dans le else, donc quandje fait un print dans le if et le else j'ai seulement la liste des lignes sans les "Ext" et celle des "Ext" j'ai rien.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Je le répète, l'exemple fonctionne pour 1 (UNE) ligne et qu'il faut mettre ce code dans une BOUCLE qui PARCOURT les lignes du fichier. Le code fait si ligne contient "EXT" il va dans la 1ère liste sinon dans la 2nde
En un seul parcourt et avec un dictionnaire comme cache/buffer.
with open('input.txt') as input_, open('output.txt', 'w') as output:
cache = {}
for line in input_:
number, label = line.strip().split(maxsplit=1)
key = "".join(c if c.isalnum() else '_' for c in label).upper()
if key.startswith('EXT_'):
cache[key[4:]] = f'{number};{label}'
elif key in cache:
output.write(cache.pop(key) + f';{number};{label}\n')
Je le répète, l'exemple fonctionne pour 1 (UNE) ligne et qu'il faut mettre ce code dans une BOUCLE qui PARCOURT les lignes du fichier. Le code fait si ligne contient "EXT" il va dans la 1ère liste sinon dans la 2nde
with open("test.txt", "r") as f1:
listes = f1.readlines()
ListeExt, listeNormale = [], []
for liste in listes:
if('EXT' in liste):
ListeExt.append(liste)
#print(liste)
else:
listeNormale.append(liste)
#print(liste)
#print(liste)
ListeFinale=[]
for i in range(len(ListeExt)):
texteATrouver<ListeExt[i].split('EXT_',maxsplit=1)[1].lower()
for texte in listeNormale:
if texteATrouver == texte.split(maxsplit=1)[1].lower():
ListeFinale.append(ListeExt[i])
break
print(ListeFinale)
ЯК a écrit:
En un seul parcourt et avec un dictionnaire comme cache/buffer.
with open('input.txt') as input_, open('output.txt', 'w') as output:
cache = {}
for line in input_:
number, label = line.strip().split(maxsplit=1)
key = "".join(c if c.isalnum() else '_' for c in label).upper()
if key.startswith('EXT_'):
cache[key[4:]] = f'{number};{label}'
else:
output.write(cache.pop(key) + f';{number};{label}\n')
- Edité par ЯК il y a 33 minutes
J'ai essayé ton code il me met un key error avec une ligne qui a pas EXT
Il faut adapter la ligne 8, j'ai édité mon message en conséquence. Et s'il y a des lignes vides dans le fichier, il faudra aussi ajouter une condition au bon endroit..
Il faut adapter la ligne 8, j'ai édité mon message en conséquence. Et s'il y a des lignes vides dans le fichier, il faudra aussi ajouter une condition au bon endroit..
- Edité par ЯК il y a 12 minutes
Normalement j'ai pas de ligne vide je les supprimer dans un autre prog au préalable effectivement avec le elif c'est mieux merci !
pourquoi le = s'est transformé en < en ligne 14 (la ligne où se produit l'erreur) ? la ligne 14 sert à initialiser la variable, donc ta nouvelle erreur est normale.
le index error voudrait dire qu'il n'y a pas de valeur dans ListeExt .. tu as réécrit et enregistré le fichier test.txt suite à l'essai précédent qui l'avait vidé ?
retire aussi le _ après EXT sur cette ligne 14, je viens de voir qu'on a "EXT RIZ CUIT" sans le underscore (_) ..... (il va causer un autre ennui, c'est que la chaine va commencer par un espace et non pas par un _ , donc pour la comparasion, encore un cas particulier ........... )
Si tu veux un exemple propre, alors il faut que tes données soient très précises et proprement annoncées,
Si je vois
8 EXT_NOIX-CAJOU
et
5 NOIX_CAJOU
ça pose un problème de format et donc difficile d'avoir une logique. Si il est écrit réellement de cette manière, faut monter à la génération du fichier et demander à ce que le format soit cohérent.
from typing import Optional
def set_line(number_of_line: int, lines: list[Optional[str]], products: list[str]) -> None:
line = lines[number_of_line]
if line:
_, product = line.split(maxsplit=1)
product = product.upper()
try:
index_of_product = products.index("EXT_" + product)
line_product = lines[index_of_product]
if line_product is not None:
lines[index_of_product] = ';'.join(
line_product.split()
) + ';' + ';'.join(line.split())
lines[number_of_line] = None
except ValueError:
products.append(product)
prods: list[str] = []
my_lines: list[Optional[str]] = []
with open("test.csv", "r", encoding="utf8") as f:
my_lines = [line.strip() for line in f.readlines()]
for ind, _ in enumerate(my_lines):
set_line(ind, my_lines, prods)
for row in my_lines:
if row is not None:
print(row)
Je pense que ça ne fonctionnera que si tes EXT se trouvent avant tes produits sans EXT.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
pourquoi le = s'est transformé en < en ligne 14 (la ligne où se produit l'erreur) ? la ligne 14 sert à initialiser la variable, donc ta nouvelle erreur est normale.
le index error voudrait dire qu'il n'y a pas de valeur dans ListeExt .. tu as réécrit et enregistré le fichier test.txt suite à l'essai précédent qui l'avait vidé ?
retire aussi le _ après EXT sur cette ligne 14, je viens de voir qu'on a "EXT RIZ CUIT" sans le underscore (_) ..... (il va causer un autre ennui, c'est que la chaine va commencer par un espace et non pas par un _ , donc pour la comparasion, encore un cas particulier ........... )
- Edité par umfred il y a environ 1 heure
Parce que avec le "=" j'avais encore l'erreur du index out of range que je n'ai toujours pas réussi a réglé, oui je l'ai réécris et enregistré après. J'ai aussi retiré le underscore.
fred1599 a écrit:
Si tu veux un exemple propre, alors il faut que tes données soient très précises et proprement annoncées,
Si je vois
8 EXT_NOIX-CAJOU
et
5 NOIX_CAJOU
ça pose un problème de format et donc difficile d'avoir une logique. Si il est écrit réellement de cette manière, faut monter à la génération du fichier et demander à ce que le format soit cohérent.
Tu n'as pas copié le traceback complet, je n'ai pas le numéro de ligne...
Mais je crains que tu dois avoir des problèmes de formatage dans ton fichier, essaye voir avec le mien.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Il ressemble exactement au tiens mais en .txt de mon coté, le tiens c'est du csv ?
ЯК a écrit:
Il faut adapter la ligne 8, j'ai édité mon message en conséquence. Et s'il y a des lignes vides dans le fichier, il faudra aussi ajouter une condition au bon endroit..
- Edité par ЯК il y a environ 1 heure
Je viens de remarquer dans ton code tu ouvre le 1er fichier pour ensuite écrire dans 2eme fichier, c'est possible de ouvrir le 1er fichier et de réecrire dans le même fichier ?
Car j'ai remplacer le test2.txt par le test.txt donc le 1er fichier, mais quand je l'ouvre après avoir exécuté le programme j'ai plus rien dans ce fichier.
le code:
with open('test.txt') as input_, open('test.txt', 'w') as output:
cache = {}
for line in input_:
number, label = line.strip().split(maxsplit=1)
key = "".join(c if c.isalnum() else '_' for c in label).upper()
if key.startswith('EXT_'):
cache[key[4:]] = f'{number};{label}'
elif key in cache:
output.write(cache.pop(key) + f';{number};{label}\n')
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
ça change rien, un fichier csv est un fichier texte
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
ça change rien, un fichier csv est un fichier texte
C'est pas exactement pareil je crois lorsqu'on fais du python
Si !
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
× 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.
Linaki, l'excellence garantie !
My website
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)