2017-10-10 49 views
0

所以我試圖遍歷一個.csv文件,並根據它做一些計算,我的問題是該文件是10001行長,當我的程序執行它似乎只閱讀這些行的5001條。在閱讀我的數據時我做錯了什麼,或者是有內存限制還是我遇到的某種其他限制?計算結果很好,但在某些情況下它們與預期結果不符,因此我相信缺失的一半數據將解決這個問題。Python for循環只讀取文件的一半

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])) 

這裏是一些樣本輸出,還有待completley格式,但它最終會被:

"""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""" 

由於這是功課我會問,你試圖保持反應有幫助,但不是徹底的解決方案,謝謝。

+0

AFAICT,你正在閱讀2線在一個迭代。 「yy」已經包含一行,調用「file.readline」會將您移動到下一行。你應該直接處理「yy」的內容而不用調用readline。 – schaazzz

回答

2

那是因爲你問的Python在兩個不同的地點讀線:

for yy in file: 

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

yy已經是從文件中的行,但你忽略了它;迭代文件對象會從文件中產生行。然後您使用file.readline()閱讀另一行。

如果使用迭代,不要使用readline()爲好,只是使用yy

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

您要重新發明了CSV讀輪,但是。請使用csv module代替。

您可以閱讀一個CSV所有數據文件到一些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

這樣做。謝謝。將ln = file.readline()。strip()。split(',')'改爲'ln = yy.strip()。split(',')'像魔術一樣工作。 – brodieR

+0

至於重新發明車輪,這是大多數comp-sci課程需要,但無論如何感謝頭。 – brodieR