Python For循环只读取文件的一半

时间:2017-10-10 17:02:40

标签: python-3.x file csv

所以我试图迭代一个.csv文件并根据它进行一些计算,我的问题是文件长10001行,当我的程序执行它时,似乎只读取这些行的5001。我在阅读我的数据时做错了什么,或者是否存在内存限制或某些其他限制?计算很好,但在某些情况下它们与预期结果不符,因此我认为缺少的一半数据将解决这个问题。

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

这里有一些示例输出,但尚未完成格式化,但最终会:

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

由于这是家庭作业,我会要求您尝试保持回复有用但不完全是解决方案,谢谢。

1 个答案:

答案 0 :(得分: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() function trickery

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