Recupérer un nombre dans un fichier texte avec python

Fermé
rom1985 Messages postés 10 Date d'inscription jeudi 24 juillet 2014 Statut Membre Dernière intervention 17 septembre 2014 - 13 sept. 2014 à 15:31
rom1985 Messages postés 10 Date d'inscription jeudi 24 juillet 2014 Statut Membre Dernière intervention 17 septembre 2014 - 17 sept. 2014 à 12:31
Bonjour à tous,

Tout d'abord je dois vous informer que je ne sais pas très bien programmer (quelque soit le langage). J'essaye d'apprendre le langage Python et j'adore ce que l'on peut faire avec mais je suis loin d'être un expert :)

Mais bon j'ai besoin de récupérer un nombre d'un gros fichier texte qui ressemble à ça :

# du texte ........
!encore du txt ......
!encore du txt ......
!encore du txt ......
!encore du txt ......
19.5 45.0 3 7 .......
98.5 0.1 5.9 5 2......
du texte 567.01 (7.08)

Le fichier est bien plus gros mais c'est l'idée et je dois donc lire ce fichier et récupérer juste le nombre réel : 567.01 (en fait il y en a un 100aine dans le fichier à recup) et ensuite les écrire en colonne dans un autre fichier texte.

J'ai en gros réussi en bidouiller un programme me permettant de copier toute la ligne :"du texte 567.01 (7.08)" et l'écrire dans un autre fichier texte. Mais j'aimerai vraiment juste copier le 567.01 mais je n'y arrive pas :((((

Merci d'avance pour votre aide
A voir également:

8 réponses

Je ferais de cette façon (voir les commentaires de mon code)

from itertools import zip_longest

COLUMN_1 = []
COLUMN_2 = []

# ligne de test
LINE_TEST = "512.56, 13.4072, 530.89, 12.2854, 550.67, 11.0875, 577.59, "

def addNumber(n):
    if n > 100:
        COLUMN_1.append(n)
    else:
        COLUMN_2.append(n)

for value in LINE_TEST.split(','):
    try:
        v = float(value)
        addNumber(v) # ajout dans COLUMN_1 ou COLUMN_2 selon valeur de v
    except ValueError:
        pass # None si pas un nombre

print(COLUMN_1) # affichage colonne 1
print(COLUMN_2) # affichage colonne 2

line_res = []
for i, j in zip_longest(COLUMN_1, COLUMN_2):
    line_res.append((i, j)) # création de chaque ligne
    
for line in line_res:
    line = map(str, line) # transformation entier en chaine
    line = '\t'.join(line) # espacement entre les deux valeurs
    print(line) # écriture dans fichier


zip_longest
1
Utilisateur anonyme
13 sept. 2014 à 15:55
Le problème n'est pas clair, nous allons pas demander à python de deviner quel numéro il doit récupérer.

Comment expliquer à python que c'est ce numéro et pas un autre ? Comment le reconnaître sans confondre les autres ?

Bref il faut avoir réfléchi au problème avant de coder, donc on attend vos détails
0
rom1985 Messages postés 10 Date d'inscription jeudi 24 juillet 2014 Statut Membre Dernière intervention 17 septembre 2014 2
13 sept. 2014 à 19:23
Oui en effet l'explication n'est pas très claire désolé.

En fait il ne faut pas lire les lignes débutant par "!" ou "#" (ça ok) et le nombre que je veux copier se trouve sur une ligne ou il y a du texte au début elle est différentes de toutes les autres.

J'aimerai donc que quand python arrive sur la ligne débutant par : "Average maximum....567.01 (7.08) " il copie juste le nombre de cette ligne mais pas celui entre parenthèse (si c'est possible).

Voilà j'espère avoir été un peu plus clair

Merci
0
Ok, nous savons maintenant que la ligne doit débuter par "Average maximum", mais peut-on avoir exactement le format d'une de ces lignes ?

Il y aurait deux solutions, selon le format s'il varie selon les lignes ou pas

Soit parser la ligne manuellement avec les méthodes habituelles sur les chaînes
Soit parser la ligne par les regex (dans le cas où les lignes ne se ressemblent pas)

Avec les regex on arrive à un code simple (faut-il connaître les regex)

>>> s = "mon texte 25.7 (7.08)"
>>> res = re.search("(\d+.\d+)", s)
>>> res.group()
'25.7'
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
rom1985 Messages postés 10 Date d'inscription jeudi 24 juillet 2014 Statut Membre Dernière intervention 17 septembre 2014 2
15 sept. 2014 à 10:28
Bonjour Fred1599,

Merci beaucoup pour ton aide en effet je ne connaissais pas les regex et il est vrai qu'ils sont simples et très efficaces j'ai donc réussi à extraire mes données les écrire dans un fichier txt séparés pas un virgule.

Maintenant je travail sur les mettre en deux colonnes selon leurs valeurs, si supérieur à 100 alors je les met dans la colonne 1 si inférieur je les met dans la colonne 2.

Je fais des recherche sur les index en écrivant des fichiers .csv est-ce la solution la plus simple?

Aurais-tu un conseil?
0
Utilisateur anonyme
15 sept. 2014 à 11:23
"Maintenant je travail sur les mettre en deux colonnes selon leurs valeurs, si supérieur à 100 alors je les met dans la colonne 1 si inférieur je les met dans la colonne 2."

Ce qui veut dire que tu auras des colonnes vides ?
Tes lignes seront séparées par ?
0
rom1985 Messages postés 10 Date d'inscription jeudi 24 juillet 2014 Statut Membre Dernière intervention 17 septembre 2014 2
15 sept. 2014 à 12:01
Je précise un peu, avec mon code précédemment j'extrayais deux valeurs qui ne sont pas les mêmes mais que je ne pouvais pas différencier avec Python. Donc le code que j'ai écris copié ces deux valeurs, dans un fichier .txt, séparées par une virgule (je peux aussi les mettre sur une colonne si besoin). Comme suit:

512.56, 13.4072, 530.89, 12.2854, 550.67, 11.0875, 577.59, 9.9835.........

Ces valeurs ont un sens différents, je voudrais donc les séparer. Les valeurs en gras doivent être dans la colonne 1 et les autres dans la colonne 2, sans colonne vide comme suit:

512.56 13.4072
530.89 12.2854
550.67 11.0875
577.59 9.9835

La différence entre ces 2 valeurs est qu'une des 2 est toujours supérieur à 100 et l'autre toujours inférieur à 100.

Voilà j'espère avoir été un peu plus clair.

Merci pour ton aide.
0
rom1985 Messages postés 10 Date d'inscription jeudi 24 juillet 2014 Statut Membre Dernière intervention 17 septembre 2014 2
17 sept. 2014 à 12:31
Merci beaucoup pour ton aide fred1599 ça marche très bien.
0