Python基础(八) 文件和异常
Python基础(八) 文件和异常
- 1从文件中读取数据
- 1.1读取整个文件
- 1.2逐行读取
- 1.3创建一个包含文件各行内容的列表
- 1.4Python可以处理包含一百万位的大型文件,没有任何的限制,只要系统的内存足够多。
- 2写入文件
- 2.1写入空文件
- 2.2附加模式
- 3异常
- 4存储数据
本人是个新手,写下博客用于自我复习、自我总结。
如有错误之处,请各位大佬指出。
参考教材:Python编程从入门到实践
1从文件中读取数据
每当需要分析或修改存储在文件中的信息时,读取文件都很有用,对数据分析应用程序来说尤其如此。要使用文本文件中的信息,首先需要将信息读取到内存中。为此,你可以一次性读取文件的全部内容,也可以每次以一行的方式逐步读取。
1.1读取整个文件
例如:
with open('pi_digits.txt')as file_object:
contents=file_object.read()
print(contents.strip())
如果想使用文件,肯定首先需要打开文件,这样才能访问它。函数open()接受一个参数:要打开文件的名称。如这个例子,如果这个文件就在当前目录,则可以直接通过文件名调用。如果这个文件在当前目录的子文件夹中,这样的方法就不行。或者有时可能要打开不在程序文件所属目录中的文件。
这样的情况下,当然需要提供文件路径,它让Python到系统的特定位置去查找。这样就可以分为两种情况,相对文件路径和绝对文件路径。
①相对文件路径:(所需要的文档在当前程序目录的子文件夹中)
如:with open('text_files\filename.txt')as file_object:
注:在Linux和OSX中,这里是/↑
②绝对文件路径:(所需要的文档在其他文件夹中)
如:file_path='C:\Users\other_files\text_files\filename.txt'
with open(file_path)as file_object:
其中的关键字with在不再需要访问文件后将其关闭。当然,也可以调用open()和close()来打开和关闭文件,但这样很危险,如果未妥善地关闭文件可能会导致数据丢失或受损。
这一切可以让Python去确定:我们只管打开文件,并在需要时使用它,Python自会在合适的时候自动将其关闭。
我们使用read()方法,可以读取这个文件的全部内容,并将其作为一个长长的字符串存储在变量contents中。这样通过打印contents值,就可将这个文本文件的全部内容显示出来。但是read()到达文件末尾时会返回一个空字符串,而将这个空字符串显示出来的时候就是一个空行。要删除末尾的空行,可在print语句中使用strip()
1.2逐行读取
要以每次一行的方式检查文件,可对文件对象使用for循环:
例如:
filename='pi_digits.txt'
with open(filename)as file_object:
for line in file_object:
print(line.strip())
1.3创建一个包含文件各行内容的列表
因为使用关键字with时,open()返回的文件对象只在with代码块内可用。如果要在with代码块外访问文件的内容,可在with代码块内将文件的各行存储在一个列表中,并在with代码块外使用该列表。这样就可以在with外使用文件的内容。
例如;
filename='pi_digits.txt'
with open(filename)as file_object:
lines=file_object.readlines()
for line in lines:
print(line.strip())
将文件读取到内容中后,就可以以任何方式使用这些数据了。
例如:
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))
注:读取文本文件时,Python将其中的所有文本都解读为字符串。如果你读取的是数字,并要将其作为数值使用,就必须使用函数int()将其转换为整数,或使用float()将其转换为浮点数。
1.4Python可以处理包含一百万位的大型文件,没有任何的限制,只要系统的内存足够多。
2写入文件
保存数据的最简单的方式之一就是将其写入到文件中。通过将输出写入文件,即便关闭包含程序输出的终端窗口,这些输出也依然存在。你可以在程序结束运行后,查看这些输出,可与别人分享输出文件,还可编写程序来将这些输出读取到内存中并进行处理。
2.1写入空文件
例如:
filename='programming.txt'
with open(filename,'w')as file_object:
file_object.write("I love programming.")
要将文本写入文件,当然首先还需要open()。但是需要在其中提供另一个实参,来告诉Python你要写入打开的文件。打开文件时,这个实参可指定:读取模式’r’、写入模式’w’、附加模式’a’或既能读取又能写入的模式’r+’。这个实参可以省略,就像10.1中那样,这样的话Python将以默认的只读模式打开文件。
如果需要写入的文件不存在,函数open()将自动创建它。然而,以写入模式’w’打开文件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件!
注:Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str()将其转换为字符串格式。
2.2附加模式
上面提到了一个附加模式’a’,这个附加模式就是,给文件添加内容,而不是覆盖原有的内容。因为’w’模式写入模式会清空之前的文件内容,‘r’只能读取,那么附加只能用’a’!添加的内容都会添加到文件末尾。
比如:
filename='programming.txt'
with open(filename,'a')as file_object:
file_object.write("I love creating apps that can run in a browser.\n")
3异常
Python使用被称为异常的特殊对象来管理程序执行期间发生的错误。每当发生让Python不知所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行;否则程序停止,并显示一个traceback,其中包含有关异常的报告。异常用try-except代码块处理,有时还用try-except-else。这样即便出现了异常,程序也将继续运行,显示你编写的友好的错误信息,而不是traceback。这样很关键,因为traceback中会透露一些程序的信息,如果被不怀好意的人利用,他们就可以根据这些信息对程序进行攻击。也就是说,一定要妥善地处理错误。
例如:
print("Give me two numbers, and I'll divide them.")
print("Enter 'q' to quit.")
while True:
first_number=input("\nFirst number:")
if first_number == 'q':
break
second_number=input("Second number:")
try:
answer=int(first_number)/int(second_number)
except ZeroDivisionError:
print("You can't divide by zero!")
else:
print(answer)
通过预测可能发生错误的代码,可编写健壮的程序,从而抵挡恶意的攻击。
4存储数据
很多程序都要求用户输入某种信息,并在用户关闭程序时,保存他们提供的信息;一种简单的方式是使用模块json来存储数据。
例如:
import json
def get_stored_username():
filename='username.json'
try:
with open(filename)as f_obj:
username=json.load(f_obj)
except FileNotFoundError:
return None
else:
return username
def get_new_username():
username=input("What is your name")
filename='username.json'
with open(filename,'w')as f_obj:
json.dump(username,f_obj)
return username
def greet_user():
username=get_stored_username()
if username:
print("Welcome back, "+username+"!")
else:
username=get_new_username()
print("We'll remember you when you come back, "+username+"!")
greet_user()
json.dump()接受两个实参:要存储的数据以及可用于存储数据的文件对象。
使用json.load()可以将文件中内容读取到内存中。
上例是重构后的代码。重构就是对代码进行划分,做进一步的改进。重构让代码更清晰、更易于理解、更容易扩展。
还没有评论,来说两句吧...