2009-11-04 7 views
0

Je dois trouver la valeur maximale et minimale d'une ligne en lisant un fichier et diviser la valeur maximale par la valeur minimale. Suis intéressé à faire cela en python.Lecture à partir de fichiers en python

le contenu du fichier (fichier.txt) ressemble à ceci ..

A28102_at,151,263,88,484,118,270,458,872,62,194 
AB000114_at,72,21,20,61,20,85,20,25,20,65 
AB000115_at,281,250,358,118,197,71,168,296,198,113 

Le problème est que je fais face devrait être pour autant négliger la première valeur, qui est jusqu'à la première occurrence de la virgule et je suis incapable pour trouver une méthode. Et je suis également intéressé pour stocker les valeurs dans un tableau, puis faire la comparaison. Cette approche est-elle correcte ou une meilleure méthode est-elle sugegsted?

+0

Vous pouvez mettre en retrait votre code/fichier avec 4 espaces pour améliorer le formatage. Je l'ai fait pour toi. Les sauts de ligne sont essentiels ici. – Thomas

+2

En Python, les tableaux sont uniquement pour les données binaires (généralement numériques) où vous devez contrôler la disposition de la mémoire. http://docs.python.org/library/array.html Pour votre problème, vous utiliseriez normalement des listes. Vous pouvez utiliser des tableaux pour les données numériques après avoir analysé les virgules et effectuer les calculs avec le tableau, mais ne pas lire les données de caractère brutes dans un tableau. –

Répondre

6

Python est livré avec des batteries! Utilisez le module csv pour analyser les fichiers csv:

#!/usr/bin/env python 
import csv 
csvobj=csv.reader(open('file.txt','r')) 
for datum in csvobj: 
    datum=[float(val) for val in datum[1:]] 
    print(datum) 
    maximum=max(datum) 
    minimum=min(datum) 
    print(maximum/minimum) 

# [151.0, 263.0, 88.0, 484.0, 118.0, 270.0, 458.0, 872.0, 62.0, 194.0] 
# 14.064516129 
# [72.0, 21.0, 20.0, 61.0, 20.0, 85.0, 20.0, 25.0, 20.0, 65.0] 
# 4.25 
# [281.0, 250.0, 358.0, 118.0, 197.0, 71.0, 168.0, 296.0, 198.0, 113.0] 
# 5.04225352113 
4

Comme vous êtes un débutant, je ne donnerai pas un extrait de code de copier/coller; il y a plus à apprendre si vous trouvez les détails vous-même. Mais voici ce que vous pouvez faire:

  • lire le fichier ligne par ligne dans une boucle, le stockage de la ligne courante dans une chaîne
  • pour chaque ligne, diviser la chaîne sur des virgules, ce qui entraîne dans une liste
  • tomber le premier élément de la liste
  • prendre le maximum du reste

Peut-être que quelqu'un d'autre viendra avec le code réel.

+0

Merci pour l'aide thomas, je vais le faire comme vous l'avez suggéré !!! –

3

Je ne suis pas sûr que ce soit la façon la plus «pythonique» de le faire, mais cela devrait fonctionner. J'utilise des listes au lieu de tableaux.

for line in fp: 
    tokens = line.split(',') # tokenize the line with comma as the only delimiter 
    numbers = map(int, tokens[1:]) # skip the first value and convert to integer values 
    maxValue = max(numbers) # max() operates on lists or sequences, I can't recall 
    minValue = min(numbers) # so does min() 
    print maxValue/minValue # TADA 

:)

+1

une façon plus pythonique peut être de diviser et d'exclure en une ligne ('numbers = line.split (',') [1:]) et d'obtenir directement la valeur (' print max (numbers)/min (numbers) ') . min et max fonctionne sur un itérable: liste, tuple, dict, itérateurs ... –

+0

Ouais, tu as raison. Je l'ai décomposé pour ajouter les commentaires. –

+3

Beaucoup semblent penser que la façon pythonique est de tout mettre sur une seule ligne. Ce n'est pas vrai, n'oublions pas que l'idée derrière Python est de garder un code clair et aussi lisible que possible par d'autres. 'import this' rappellera probablement qu'en cas de doute ;-) Maintenant, il y a la question de l'efficacité du code (en utilisant des générateurs pour éviter des listes très longues, en favorisant la compréhension des listes sur des constructions de filtres/cartes plus coûteuses, ...) est autre chose. – RedGlyph

Questions connexes