1 文件
1.1 从文件中读取数据
(1)读取整个文件
# xx表示文件名,yy表示文件的对象
with open('xx') as yy:
要以任何方式使用文件—哪怕仅仅是打印其内容,都得先打开文件,这样才能访问它。函数open()接受一个参数:要打开的文件的名称。Python在当前执行的文件所在的目录中查找指定的文件。
关键字with 在不再需要访问文件后将其关闭。在这个程序中,注意到我们调用了open(), 但没有调用close();你也可以调用open() 和close() 来打开和关闭文件,但这样做时,如果程序存在bug,导致close() 语句未执行,文件将不会关闭。这看似微不足道,但未妥善地关闭文件可能会导致数据丢失或受损。如果在程序中过早地调用close(),你会发现需要使用文件时它已关闭(无法访问), 这会导致更多的错误。并非在任何情况下都能轻松确定关闭文件的恰当时机,但通过使用前面所示的结构,可让Python去确定:你只管打开文件,并在需要时使用它,Python自会在合适的时候自动将其关闭。
创建一个文件.txt文件,内容为随意的三行数字,例如下图:
4355465
4464665
1645954
读取整个文件
with open(r'C:\Users\19248\Desktop\pro\numbers.txt') as file_object:
context = file_object.read()
print(context.rstrip())
输出:
4355465
4464665
1645954
细节:
(1)open()函数中r,表示不转义,使用真实字符。
(2)路径有相对路径和绝对路径,这里如果直接写一个文件名,那么这个文件就必须在这个工程里面,否则程序就会报错,找不到这个文件,对于绝对路径来说,随便放在哪个文件夹中,只要绝对路径正确就可以找到。对于路径中使用的是反斜杠(\ )而不是斜杠(/ )
(2)逐行读取
with open(r'C:\Users\19248\Desktop\pro\numbers.txt') as file_object:
for line in file_object:
print(line.rstrip())
这里在结尾加了一个rstrip()函数,这个函数删除(剥除)字符串末尾的空白
(3)创建一个包含文件各行内容的列表
方法readlines() 从文件中读取每一行,并将其存储在一个列表中
with open(r'C:\Users\19248\Desktop\pro\numbers.txt') as file_object:
lines = file_object.readlines()
for line in lines:
print(line.rstrip())
输出:
4355465
4464665
1645954
1.2 写入文件
(1)写入文件
filename = r'C:\Users\19248\Desktop\pro\numbers.txt'
with open(filename,'w') as file_object:
file_object.write("I love programming.")
结果:
写入模式 | w |
---|---|
读取模式 | r |
附加模式 | a |
读写模式 | r+ |
注意:
在写入多行时,需要指定换行符
(3)附加到文件
给文件添加内容,而不是覆盖原有的内容,可以选择附加模式打开文件,在写入到文件的行都将添加到文件末尾。如果指定的文件不存在,Python将为你创建一个空文件。
filename = r'C:\Users\19248\Desktop\pro\numbers.txt'
with open(filename,'w') as file_object:
file_object.write("I love programming")
file_object.write(",but I don't like study\n")
结果显示:
2 异常
2.1 使用异常避免崩溃
try-except-else代码块的工作原理如下:将可以引发异常的代码放在try语句中,如果try中的代码出现异常,就执行except中的代码,如果try中的代码没有出现异常,如果有else,就执行else中的语句。
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 0!")
else:
print(answer)
输出:
常见异常汇总:
AttributeError | 试图访问一个对象没有的属性 |
---|---|
IOError | 输入/输出异常;基本上是无法打开文件 |
SyntaxError | Python代码非法,代码不能编译 |
TypeError | 传入对象类型与要求的不符合 |
KeyError | 试图访问字典里不存在的键 |
NameError | 使用一个还未被赋予对象的变量 |
IndexError | 下标索引超出序列边界 |
FileNotFoundError | 找不到文件 |
2.2 pass语句
在函数中使用pass语句,将什么都不做,继续运行。
3 存储数据
3.1 使用json.dump() 和json.load()
json是一种数据交换格式
json.dump()是存储数据,接受两个实参:要存储的数据以及可用于存储数据的文件对象
如下:
import json
numbers = [1,2,3,4]
filename = 'numbers.json'
with open(filename,'w') as f_obj:
json.dump(numbers, f_obj)
输出:
json.load()读取写入的文件,参数是文件对象
下面是一个dump()和load()的结合使用:
尝试打开username.json文件。如果这个文件存在,就将其中的用户名读取到内存中,再执行else 代码块,即打印一条欢迎用户回来的消息。用户首次运行这个程序时,文件username.json不存在,将引发FileNotFoundError 异常,因此Python将执行except 代码块:提示用户输入其用户名,再使用json.dump() 存储该用户名, 并打印一句问候语。