从文件中读取数据

下面的示例程序演示了处理来自文本文件的数据的基础知识。该程序设计用于处理包含温度读数列表的文本文件。文本文件中每行列出一个读数。程序将从文本文件中读取读数列表,将读数放入列表中,然后确定并打印文件中找到的最低和最高温度读数。

temps = [] f = open('temp .txt‘) for line in f.r elines (): temp .append(float(line)) f.r eclose()最低= temps[0]最高= temps[0] for t in temps:如果t <最低:最低= t如果t >最高:最高= t print(’最低温度= ‘+str(最低))print(’最高温度= '+str(最高))

以下是在节目中需要注意的一些事情。

  1. 处理文件的第一步是打开文件。的open ()函数打开一个文件进行读取并返回一个文件对象。的参数open ()指定要打开的文件的名称。
  2. f.readlines ()返回文本文件中可迭代的行列表。我们设置了一个for循环来遍历这个行列表。
  3. 文本文件中的每一行都是一个字符串。在将该字符串添加到temp列表之前,我们必须将其转换为浮点数。
  4. 从文件中读取数据后,使用close ()方法关闭文件。

由于我们在完成文件处理后总是要小心地关闭它,因此使用另一种结构来管理打开和关闭文件可能会有所帮助。Python with结构对于这个目的很有用。

代替

F = open('temp .txt') for line in f.r elines (): temp .append(float(line)) f.r eclose ()

我们可以做到

使用open('temps.txt')作为f: for line .readlines(): temps.append(float(line))

一旦退出with构造体,文件就会自动关闭。此外,如果程序在函数体的任何地方产生错误,程序将自动退出with的函数体并为我们关闭该文件。

写入文件

下一个示例是一个简短的程序,我使用它为temps.txt数据文件生成一些随机数据。

Import random f = open('temp .txt','w') for n in range(0,50): f.write('{:2.1f}\n'.format(random.random()*100)) f.close()

在这个程序中有一些需要注意的事情。

  1. 我们将使用随机模块来生成一个随机温度读数列表。
  2. 和前面的例子一样,我们使用open ()打开文件的函数。的第二个可选参数open ()函数是文件模式说明符。因为我们打开这个文件是为了写,所以我们使用‘w’模式说明符。
  3. 要将文本写入文件,我们使用write ()方法。我们传递给的参数write ()是我们想要写入文件的文本字符串。我们必须注意确保字符串以换行符结束,\ n,以便文本在末尾换行。
  4. 我们使用随机()函数从random模块生成一个范围从0.0到1.0的随机浮点数。我们将这个随机数乘以100,将其扩大到0.0到100.0的范围。
  5. 和前面的例子一样,我们使用close ()方法在完成对文件的写入时关闭文件。

一个通用的数据读取函数

在接下来的几个例子中,我们将从文本文件中读取数据。在每种情况下,数据都将被安排为一个数据系列,在文件的每行上都有一个数据项列表。下面的Python函数将作为通用数据读取函数,从文本文件中加载原始数据。该函数将输入文件的各个行作为文本字符串读取,然后使用string split()方法将每行拆分为单个数据项的字符串列表。

def readData(fileName): ““”通用数据读取函数:读取文本文件中的行并将它们分割成列表。”“” data = [] with open(fileName) as f: for line in f.r readlines(): data.append(lineToData(line.split()))返回数据

下一步通常是将数据列表中的字符串转换为适合特定赢博体育程序的数据格式。例如,在下一个示例程序中,我们将复制我在几节课前展示的线性回归示例。我们将使用如下所示的输入文件:

1935  32.1
1940  30.5
1945  24.4
1950  23
1955  19.1
1960  15.6
1965  12.4
1970  9.7
1975  8.9
1980  7.2

在readData中调用split()返回的数据列表中的第一个条目如下所示

(“1935”,“32.1”)

我想将这对字符串转换成包含整数和浮点数组合的元组。下面是一个可以执行该转换的简单数据清理函数:

def lineToData(线)将原始行列表转换为适当的数据格式。return (int(line[0]),float(line[1]))

然后,readData()将使用这个lineToData函数将数据放入我们需要的格式中。

pairs = readData('farm.txt')

线性回归程序

下面是读取农场人口数据并对数据执行回归分析的程序。请注意帮助我们执行回归计算关键部分的函数定义。

deflinetodata (line): ““”将原始行列表转换为适当的数据格式。”“” return (int(line[0]), float(line[1])) def readData(fileName): ““”通用数据读取函数:读取文本文件中的行并将它们分割成列表。””“data =[]张开(文件名)f:线在f.readlines (): data.append (lineToData (line.split()))返回数据def意味着(双):xSum = 0 ySum x = 0, y成对:xSum + y = x ySum + = N = len(双)返回xSum / N, N ySum / def协方差(对,意味着):金额为x = 0, y成对:总和+ = (x -意味着[0])* (y -意味着[1])返回总和def xVariance(对,xMean):金额为x = 0, y成对:总和+ = (x - xMean) * (x - xMean)返回总和def regressionCoeffs(双):从(x,y)对的列表中计算线性回归系数(a,b)。“” m = means(pairs) beta = covariance(pairs, m) / xVariance(pairs, m[0]) alpha = m[1] - beta * m[0] return (alpha, beta) pairs = readData(' field .txt') a, b = regressionCoeffs(pairs) for x, y in pairs:预测= a + x * b print(‘Year: {:d} prediction: {:5.2f} Actual: {:5.2f}’。格式(x,预测,y))

这个程序产生的输出是

年份:1935年预测:31.49实际:32.10年份:1940年预测:28.56实际:30.50年份:1945年预测:25.62实际:24.40年份:1950年预测:22.69实际:23.00年份:1955年预测:19.76实际:19.10年份:1960年预测:16.82实际:15.60年份:1965年预测:13.89实际:12.40年份:1970年预测:10.96实际:9.70年份:1975年预测:8.02实际:8.90年份:1980年预测:5.09实际:7.20

这对于线性回归来说是正确的。

编程练习

编写一个Python程序,从名为‘one.txt’和‘two.txt’的文件中读取两个整数列表,然后确定第一个文件中的哪些数字不会出现在第二个文件中。构造一个这些数字的列表,然后将该列表写入名为‘diff.txt’的第三个文件。

要提交你的作业进行评分,将你的整个项目文件夹压缩成ZIP文件,并将该文件作为附件发送到电子邮件中。