一、从文件中读取数据
①一次性读取
②每次一行的方式逐步读取
读取整个文件
在main.py中的代码如下:
with open('pi_digits.txt') as file_object:
contents=file_object.read()
print(contents)
分析:
1.要使用文件,先要打开文件。用函数open()接收一个参数,为要打开的文件名称,返回一个表示文件的对象。再将这个对象存储在后面使用的变量中
2.关键字with:在不再需要访问文件后将其关闭(推荐使用此方法)。不推荐使用close(),因为不是每个人都能很好把控关闭文件的时机。
3.方法read():读取文件的全部内容,将其作为一个长长的字符串存储在变量contents中。
在main.py所在的目录下创建文件pi_digits.txt内容为:
3.1415926535
8979323846
2643383279
运行后得到结果:
相比于原文件,输出的末尾多了一个空行。因为read()到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行。要删除多出来的空行,可在print语句中使用rstrip()删除字符串末尾的空白。
with open('pi_digits.txt') as file_object:
contents=file_object.read()
print(contents.rstrip())
结果:
逐行读取
filename='pi_digits.txt'
with open(filename) as file_object:
for line in file_object:
print(line)
空行更多了,因为在文件的每行后都有一个看不见的换行符,而print语句也会加上一个换行符。消除多余空白行,使用rstrip()
filename='pi_digits.txt'
with open(filename) as file_object:
for line in file_object:
print(line.rstrip())
创建一个包含文件各行内容的列表
使用关键字with时,open()返回的对象只能在with代码块内使用。如果想要在with代码块外使用该怎么办呢?可在with代码块内将文件的各行存储在一个列表中。
"""将文件各行存储在列表中"""
filename='pi_digits.txt'
with open(filename) as file_object:
lines=file_object.readlines()
for line in lines:
print(line.rstrip())
方法readlines()从文件中读取每一行,并将其存储在一个列表中。接下来,该列表被存储到变量lines中。列表lines中的每个元素都对应于文件中的一行。
使用文件的内容
"""使用文件的内容"""
filename='pi_digits.txt'
with open(filename) as file_object:
lines=file_object.readlines()
pi_string=''
for line in lines:
pi_string+=line.strip()
print(pi_string)
print(len(pi_string))
创建一个空字符串,使用方法strip()删除空格。
包含一百万位的大型文件
如果文本文件中存储的不是精确到小数点后30位的圆周率值,而是后1 000 000位的圆周率值,也无需对前面的程序做任何修改,只需将前面的文件传给它即可。
对于你可处理的数据量,Python没有任何限制;只要系统的内存足够多,你想处理多少数据都可以。
二、写入文件
通过将输出写入文件,即便关闭包含程序输出的终端窗口,这些输出也依然存在:可以在程序结束运行后查看这些输出,可与别人分享输出文件,还可以编写程序来将这些输出读取到内存中并进行处理。
1.写入空文件
"""写入空文件"""
filename='programming.txt'
with open(filename,'w') as file_object:
file_object.write("I love programming!")
解释:
1.要将文本写入文件,调用open()时要提供另外一个参数。
参数①:也是要打开的文件的名称
参数②:这里为'w',告诉Python要以写入模式打开文件。
打开文件时,还可以指定的模式有:读取模式('r')、附加模式('a')、让我们能够读取和写入文件的模式('r+')
2.如果省略了模式参数,就会以默认的模式(只读模式)打开文件。
3.如果要写入的文件不存在,函数open()将自动创建它。
4.以写入模式('w')打开文件时要小心,如果指定文件已经存在,在返回文件对象前清空该文件。
5.Python只能将字符串写入文本文件。所以在要将数值数据写入文本文件中时,必须先使用函数str()将其转换成字符串格式。
2.写入多行
函数write()不会在写入的文本末尾添加换行符。
"""写入多行"""
filename='programming.txt'
with open(filename,'w') as file_object:
file_object.write("I love programming.")
file_object.write("I love creating new games.")
结果:
需要添加换行符:
"""写入多行"""
filename='programming.txt'
with open(filename,'w') as file_object:
file_object.write("I love programming.\n")
file_object.write("I love creating new games.\n")
还可以使用空格、制表符和空行来设置这些输出的格式。
3.附加到文件
使用附加模式。
添加内容,而不是覆盖原来的内容,不会在返回文件对象前清空文件。
写入到文件的行都将添加到文件末尾。
如果指定的文件不存在,Python将会创建一个空文件。
"""附加到文件"""
filename='programming.txt'
with open(filename,'a') as file_object:
file_object.write("I also love finding meaning in large datasets.\n")
file_object.write("I love creating appps.\n")
三、异常
每当发生让Python不知所措的错误时,它都会创建一个异常对象。如果编写了处理该异常的代码,程序将继续运行;如果未对异常进行处理,程序将停止,并显示一个traceback,其中包含异常的报告。
异常是使用try-except代码块进行处理的。这个代码块让Python执行指定的操作,同时告诉Python发生异常时该怎么做。使用了try-except代码块后即便出现了异常,程序也将继续运行,显示你编写的友好的错误信息。
"""除以0时"""
print(5/0)
不出意外的出现了错误:
程序停止运行,并在上面的traceback中指出发生了哪种异常,我们可以根据这些信息对程序进行修改。
1.使用try-except代码块
try:放导致错误的代码行
except:放处理错误的代码。except后会指定错误类型
如果try中的代码没有问题,就会跳过except中的代码;如果出现错误,就会运行except中和引发的错误相同的代码。
上一个的例子中可以知道是发生了ZeroDivisionError异常。处理ZeroDivisionError异常的try-except代码块如下:
"""使用try-except代码块处理ZeroDivisionError异常"""
try:
print(5 / 0)
except ZeroDivisionError:
print("You can't divide by zero!")
如果try-except后还有其他代码,程序将接着执行。
2.try-except-else代码块
Python尝试执行try中的代码,只有可能引发异常的代码才需要放在try中;
try代码块成功执行后可能需要运行的代码放在else代码块中;
如果在尝试执行try代码块中的代码时引发了异常,执行except中的代码块。
使用异常的重要性:
发生错误时,如果程序还有工作没有完成,妥善地处理错误显得尤为重要。这种情况经常出现在要求用户提供输入的程序中;如果程序能够妥善地处理无效输入,就能再提示用户提供有效输入,而不至于崩溃。
例子:简单计算器
"""简单计算器--未使用try-except-else时"""
print("Give me two numbers,I will divide them.")
print("Enter 'q' to quit.")
while True:
first_number=input("First number: ")
if first_number=='q':
break
second_number = input("Second number: ")
if second_number == 'q':
break
answer=int(first_number)/int(second_number)
print(answer)
下面对代码进行更改:
"""简单计算器--未使用try-except-else时"""
print("Give me two numbers,I will divide them.")
print("Enter 'q' to quit.")
while True:
first_number=input("First number: ")
if first_number=='q':
break
second_number = input("Second number: ")
if second_number == 'q':
break
try:
answer = int(first_number) / int(second_number)
except ZeroDivisionError:
print("You can't divide by 0!")
else:
print(answer)
3.
参考:《Python编程从入门到实践》