我要悄悄学Python之文件与异常(一)
刚刚过完清明的假期,现在周末也过完了,转眼间就是周二了。
不知道年后的这段时间里,你们是否也会有这样的感受:
★ 身边的大佬越来越多,差距越来越大,我不能停下;
大家都在做副业赚钱,我也要抓紧跟上脚步;
假期同事和舍友都在学习课程,我也需要去报名提升自己;
”
生怕一天不努力,就会被人远远的甩在身后 。
我们总是在不自觉地,与他人较劲,在别人的世界里争高低,让自己喘不过气,活得异常焦虑。
文件与异常(一)
在本篇文章中你可以学到:
- 读取和写入文本文件
- 处理数据集合
- 处理命令行参数
- 抛出和处理异常
读取和写入文本文件
文本文件的例子不仅包括使用windows记事本等简单文本编辑器创建的文件,还包括Python源代码文件和HTML文件。在接下来的过程中,你会学到如何处理文件中的数据。文件处理在很多学科中都是非常有用的技能,因为要分析或处理大数据集通常是存储在文件中的。
打开文件
为了访问文件,必须先打开它,打开文件时,你指定文件的名字,或者如果文件存储在其他文件夹时要在文件名前面加上文件路径。要注意的是:当要打开的文件与代码文件在相同路径的情况下的时候,我们才说直接写文件名即可。假设,现在你要读取与程序在相同文件夹中名为
input.txt
的文件中的数据,那么你可以使用下面的函数来调用打开这个文件:
infile = open('input.txt', 'r')
这个语句可以读模式打开文件通过字符串参数“r”来表示并且返回一个与input.txt文件关联的文件对象。以读模式打开文件时,文件必须存在,否则会引发异常。
调用open函数返回的文件对象必须保存在一个变量中,所有处理文件的操作都能通过这个文件对象来完成。
为了以写模式打开一个文件,你提供文件名作为open函数的第一个参数,并提供字符串"w"作为第二个参数:
outfile = open('output.txt', 'w')
如果输出文件已经存在,那么它在写入新数据之前会被清空。如果文件不存在一个空文件。处理完文件之后,确定使用close方法关闭文件。
infile.close()
outfile.close()
如果你的程序以写模式打开了文件,退出时没有及时关闭,有些输出的内容可能并没有写入到磁盘文件。
文件关闭之后,再重新打开之前就不能再使用了。试图这样做的话会导致异常。
读取文件
为了从文件中读取一行文本,调用打开文件时返回文件对象的readline方法:
line = infile.readline()
打开文件时,输入标记被定位在文件的开始处。readline方法从当前位置开始读取文本,直到遇到行尾,然后输入标记被移动到下一行。readline方法返回读取到的文本,包括表示行尾的换行符。
假设input.txt文件中包含下面几行:
flying
circus
第一次调用readline方法时会得到字符串'flying\n',其中\n代表一行结束的换行符。如果你再调用readline方法,会返回字符串'circus/n'。再次调用readline方法会返回空字符串。
从文件中读取多行文本,我们只需要重复读取一行文本并处理它,因为我们已经到达文件的末尾,如果文件中包含一个空行,那么readline方法会返回一个只包含换行符'\n'的字符串。
infile = open('input.txt', 'r')
line = infile.readline()
while line!= '':
print(line)
line = infile.readline()
警戒值是空字符串,也就是达到文件尾部之后readline方法返回的内容。
与input方法一样,readline方法也只能返回字符串。如果文件中包含数字数据,使用int或float函数把字符串转化为数字值。
例如:
value = int(line)
注意:把字符串转换为数值时,尾部的换行符会被忽略。
写入文件
你可以以写的模式打开的文件中写入文本。这通过文件对象的write方法来完成。例如,我们可以使用下面的语句往输出文件中写入字符串'Hello World';
outfile = open('outfile.txt', 'w')
outfile.write('Hello World\n')
文件对象的write方法接收单个字符串作为参数,并立刻将字符串写入。那个字符串被追加到文件的尾部,你必须显式的写一个换行符来另起一行。
count = 10
totle = 8.252
outfile = open('outfile.txt', 'a')
outfile.write('Number of entries: %d\nTotal: %8.2f\n' % (count, totle))
注意:需要以追加的模式打开文件,通过字符串传参'a'表示。
作为代替,可以使用print函数往文件中写入文本。这时需要提供文件对象作为参数file的值。
outfile = open('outfile.txt', 'a')
print('Hello World', file=outfile)
文件处理实战
假如你有一个包含一系列浮点数的文本文件,每行一个浮点数。你需要读取这些值并写入到一个新的输出文件中,按列对齐,然后再写入它们的总和和平局值。
文件的内容如下:
32.0
# 该程序用来读取一个包含数字的文件,然后写入另一个文件
# 按列对齐,最后写入它们的总和和平均值
# 提示用户输入输出文件的名字
inputFileName = input('Input file name: ')
outputFileName = input('Output file name: ')
# 打开输入文件和输出文件
infile = open(inputFileName, 'r')
outfile = open(outputFileName, 'w')
# 读取输入文件,并写出输出文件
total = 0.0
count = 0
line = infile.readline()
while line != '':
value = float(line)
outfile.write('%15.2f\n' % value)
total = total + value
count = count + 1
line = infile.readline()
outfile.write('%15s\n' % '-------------')
outfile.write('Total: %6.2f\n' % total)