1、从文件中读取数据
1.1读取整个文件
要读取数据,需要一个包含文本的文件。
设将文本保存在diligits.txt文件中,文件内容为圆周率:
下面是打开并读取该文件的代码:
with open('diligits.txt') as file_object:
contents = file_object.read()
print(contents.rstrip())
在这行代码中:
- 函数open()接受一个参数:要打开文件的名称。Python会在当前执行的文件所在的目录中查找指定的文件。然后返回一个表示文件的对象,Python将该对象赋给了file_object以备之后使用
- 关键字with在不再需要访问文件后将其关闭。也可以调用open(0和close()来打开和关闭文件。但通过使用该结构,可以让Python去决定:你只管打开文件,并在需要时使用它,Python自会在合适的时候自动将其关闭。
- read()函数用于读取这个文件的全部内容,并将其作为一个长长的字符串赋给变量contents
- rstrip()函数用于删除字符串最后多出的空字符串。因为read()到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行。
通过read()函数获取的对象contents是一个字符串类型
1.2文件路径
文件路径包括绝对路径和相对路径。
- 相对路径是相对于当前运行程序所在目录的。
- 绝对路径是指文件在计算机中的精确位置。
注意:显示文件路径时,Windows系统使用反斜杠(‘\’)而不是斜杠(‘/’),但在代码中依然可以使用斜杠。如果在文件路径中直接使用反斜杠,将引发错误,因为反斜杠用于对字符串中的字符进行转义。
1.3逐行读取
读取文件时,常常需要检查其中的每一行:有时候要在文件中查找特定的信息,或者要以某种方式修改文件中的文本。要以每一次一行的方式检查文件,可以对文件对象使用for循环。
with open('diligits.txt') as file_object:
for line in file_object:
print(line.rstrip())
通过read()函数获取的对象line是一个字符串类型
1.4创建一个包含文件各行内容的列表
使用关键字with时,open()返回的文件对象只在with代码块内使用。若想在with代码块外也能访问该文件内容,可在with代码块内将文件各行内容存储在一个列表中。
而readlines()函数返回的对象类型正是列表类型。
with open('diligits.txt') as file_object:
lines = file_object.readlines()
print(type(lines))
for line in lines:
print(line.rstrip())
1.5使用文件的内容
将文件读取到内存后,就能以任何方式使用这些数据了。
- readline()函数返回的对象类型为字符串
- readlines()函数返回的对象类型为列表
- string.lstrip()函数能删除字符串左边的空隔
- string.strip()函数能删除字符串左右两边的空隔
- string.rstrip()函数能删除字符串右边的空隔
注意:读取文本文件时,Python将其中的所有文本都解读为字符串。如果读取的是数,并要将其作为数值使用,就必须使用函数int()将其转换为整数或使用函数float()将其转换为浮点数。
2、写入文件
保存数据的最简单方式之一就是将其写入文件中。
2.1写入空文件
要将文本写入文件,在调用open()时需要提供另一个实参,告诉Python你要写入打开的文件。
with open('test1.txt','w') as file_object1:
file_object1.write("I love Java")
- 调用open()时提供了两个实参,第一个实参是要打开文件的名称;第二个实参是告诉Python要以什么模式打开该文件。
- 打开文件时可指定①读取模式(‘r’)②写入模式(‘w’)③附加模式(‘a’)或④读写模式(‘r+’)。如果省略了模式参数,Python将以默认的只读模式打开文件。
- 如果要写入的文件不存在,函数open()将自动创建它,以写入模式(‘w’)打开文件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件的内容。
- Python只能将字符串写入文本文件,要将数值数据存储到文本文件中,必须先使用函数str()将其转换为字符串格式。
- 写入多行:函数write()不会在写入的文本末尾添加换行符,因此如果写入多行时没有指定换行符,文件看起来可能不是你希望的那样,而是会直接挤在一起,所以需要在方法调用write()中包含换行符。
- 附加到文件:如果要给文件添加内容,而不是覆盖原有内容,可以以附加模式打开文件,这样Python不会返回文件对象前清空文件的内容。
2、异常
每当发生让Python不知所谓的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行,如果未对异常进行处理,程序将停止并显示异常报告(traceback)
2.1使用try-except代码块
当你认为可能会发生错误时,可编写一个try-except代码块来处理可能发生的异常。
try:
print(5/0)
except ZeroDivisionError:
print("错误")
else:
print('go on')
如果try代码块里面的代码运行起来没啥问题,Python将跳过except代码块,继续执行下一步操作,但如果try代码块中的代码导致了错误,Python将执行except代码块中的代码。
如果except后面不知道加什么异常可以故意制造一个异常,看报的是什么异常然后再写上去
- 分析文本:split()函数可以根据一个字符串创建一个单词列表:方法split()以空格为分隔符将字符串分拆成多个部分,并将这些部分都存储到哦一个列表中
- 静默失败:有时候希望程序在发生异常时保持静默,就像上面都没有发生一样继续运行,Python有一个pass语句,可以让Python在代码块中什么都不做。pass语句还充当了占位符,提醒你在程序的某个地方什么都没有做,以便今后或许在这个位置能做点什么。
3、存储数据
很多程序要求输入的数据能够在用户关闭程序时还能保存以便今后使用。模块json便能够将简单的Python数据结构存储到文件中,并在程序再次运行时加载该文件中的数据。(还可以使用json在Python程序之间分享数据。更重要的是该格式并非Python专用,这使得我们能够将json格式存储的数据与使用其他编程语言的人分享。
3.1使用json.dump()和json.load()
json.dump()函数用来存储数据,而Json.load()函数用来讲数据读取到内存。
- json.dump()接受两个实参:①要存储的数据,②用于存储数据的文件对象
- json.load()接受的参数是:用于存储数据的文件对象
import json
number = [1,2,'w','wef']
filename = 'numbers.json'
with open(filename,'w') as f:
json.dump(number,f)
with open(filename) as f:
numbers = json.load(f)
print(numbers)