2017-10-10 3 views
0

Donc j'essaye de parcourir un fichier .csv et d'en faire des calculs, mon problème étant que le fichier est long de 10001 lignes et quand mon programme l'exécute lisez 5001 de ces lignes. Est-ce que je fais quelque chose de mal en lisant mes données ou y a-t-il une limite de mémoire ou une sorte d'autre limite que je rencontre? Les calculs sont bons, mais ils sont loin des résultats attendus dans certains cas et je suis donc amené à croire que la moitié manquante des données permettra de résoudre ce problème.Python Pour la boucle lit seulement la moitié du fichier

fileName = 'normal.csv' #input("Enter a file name: ").strip() 
file = open(fileName, 'r') #open the file for reading 
header = file.readline().strip().split(',') #Get the header line 
data = [] #Initialise the dataset 
for index in range(len(header)): 
    data.append([]) 
for yy in file: 
    ln = file.readline().strip().split(',') #Store the line 
    for xx in range(len(data)): 
     data[xx].append(float(ln[xx])) 

Et voici quelques exemple de sortie, encore completley formaté, mais il sera finalement:

"""The file normal.csv contains 3 columns and 5000 records. 
     Column Heading |  Mean  |  Std. Dev.  
     --------------------+--------------------+-------------------- 
     Width [mm]|999.9797|2.5273 
     Height [mm]|499.9662|1.6889 
     Thickness [mm]|12.0000|0.1869""" 

Comme il est des devoirs que je vous demande d'essayer de garder les réponses utiles mais pas purement et simplement la solution, merci.

+0

AFAICT, vous lisez 2 lignes dans une itération. "yy" contient déjà une ligne, et appeler "file.readline" vous amènera à la ligne suivante. Vous devriez directement traiter le contenu de "yy" sans appeler readline. – schaazzz

Répondre

2

C'est parce que vous demandez Python pour lire des lignes à deux endroits différents:

for yy in file: 

et

ln = file.readline().strip().split(',') #Store the line 

yy est déjà une ligne du fichier, mais vous l'ignora; L'itération sur un objet fichier génère des lignes à partir du fichier. Vous lisez ensuite une autre ligne en utilisant file.readline().

Si vous utilisez l'itération, ne pas utiliser readline() aussi bien, il suffit d'utiliser yy:

for yy in file: 
    ln = yy.strip().split(',') #Store the line 

Vous Réinventer la roue lecture CSV, cependant. Utilisez simplement le csv module à la place.

Vous pouvez lire toutes les données dans un fichier CSV dans une liste par colonne avec quelques zip() functiontrickery:

import csv 

with open(fileName, 'r', newline='') as csvfile: 
    reader = csv.reader(csvfile, quoting=csv.QUOTE_NONNUMERIC) # convert to float 
    header = next(reader, None) # read one row, the header, or None 
    data = list(zip(*reader)) # transpose rows to columns 
+0

C'est ce qu'il a fait. Merci. Changé 'ln = file.readline(). Strip(). Split (',')' en 'ln = yy.strip(). Split (',')' Fonctionne comme un charme. – brodieR

+0

Quant à réinventer la roue, c'est ce que la plupart des cours comp-sci impliquent, mais merci pour les heads-up de toute façon. – brodieR