Python学习笔记(4)文件与异常

 Max.C     2020-02-27   5329 words    & views

一、文件

1、打开文件

open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。

注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。

open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。

open(file, mode='r')

完整的语法格式为:

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

参数说明:

  • file: 必需,文件路径(相对或者绝对路径)。
  • mode: 可选,文件打开模式
  • buffering: 设置缓冲
  • encoding: 一般使用utf8
  • errors: 报错级别
  • newline: 区分换行符
  • closefd: 传入的file参数类型

mode 参数有:

模式 描述
t 文本模式 (默认)。
b 二进制模式。
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

默认为文本模式,如果要以二进制模式打开,加上 b

一般操作文件的格式为:

with open('file_name') as file_obj:
	# code

2、文件路径

调用open()时,Python会在当前程序文件的目录下查找文件,若文件在其他路径,需要说明相对路径绝对路径

在Linux和OS X中,在文件路径中使用的是斜杠(/):

with open('text_files/filename.txt') as file_object:

在Windows系统中,在文件路径中使用反斜杠(\)而不是斜杠(/):

with open('text_files\filename.txt') as file_object: 

在Linux和OS X中,绝对路径类似于下面这样:

file_path = '/home/ehmatthes/other_files/text_files/filename.txt'
with open(file_path) as file_object:

而在Windows系统中,它们类似于下面这样:

file_path = 'C:\Users\ehmatthes\other_files\text_files\filename.txt'
with open(file_path) as file_object: 

3、读取

read() 用于从文件读取指定的字节数,如果未给定参数或参数为负则读取所有;

语法如下:

fileObject.read(size); 
  • size – 从文件中读取的字节数。
  • 返回从字符串中读取的字节。

readline() 用于从文件读取整行,包括 “\n” 字符。如果指定了一个非负数的参数,则返回指定大小的字节数,包括 “\n” 字符。

语法如下:

fileObject.readline(size); 
  • size – 从文件中读取的字节数。
  • 返回从字符串中读取的字节。

readlines() 读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for... in ... 结构进行处理。 如果碰到结束符 EOF 则返回空字符串。

语法如下:

fileObject.readlines( );

返回列表,包含所有的行。

示例:

filename = 'index/file.txt'

with open(filename) as file_object:
	lines = file_object.readlines()
	
pi_string = ''
for line in lines:
	pi_string += line.rstrip() 

读取时将文本解读为字符串。

4、写入

写入时,要记得在open()将模式设置为’r’或者’a’;

write() 方法用于向文件中写入指定字符串。

在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时在文件中是看不到写入的内容的。

如果文件打开模式带 b,那写入文件内容时,str (参数)要用 encode 方法转为 bytes 形式;

语法如下:

fileObject.write( [ str ])
  • str – 要写入文件的字符串。
  • 返回的是写入的字符长度。

writelines() 用于向文件中写入一序列的字符串。

这一序列字符串可以是一个字符串列表、元组等。

换行需要制定换行符 \n。

语法如下:

fileObject.writelines( [ str ])
  • str – 要写入文件的字符串序列。
  • 没有返回值。
# 打开文件
fo = open("test.txt", "w")
seq = ["line1\n", "line2\n","line3"]
fo.writelines( seq )

5、数据存储

利用模块json,将Python数据->.json文件,可以在程序之间分享数据。

  • json.dump(): 对数据进行编码。
  • json.load(): 对数据进行解码。

json.dump()接受两个实参:要存储的数据以及可用于存储数据的文件对象

json.load()接受一个实参:用于读取数据的文件对象

# 写入 JSON 数据
with open('data.json', 'w') as f:
	json.dump(data, f)

# 读取数据
with open('data.json', 'r') as f:
	data = json.load(f)

二、异常

1、捕捉异常

异常捕捉可以使用 try/except 语句。

try:
	# code
except AssertionError as error:
  print(error)
	# code
else:
	# code
finally:
	# code

如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。

如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中。

一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组:

except (RuntimeError, TypeError, NameError):
	pass

最后一个except子句可以忽略异常的名称,它将被当作通配符使用:

except RuntimeError:
	# code
except TypeError:
	# code
except NameError:
	# code
except:
	# code

2、常见异常类型

异常 含义
BaseException 所有异常的基类
SystemExit      解释器请求退出
KeyboardInterrupt  用户中断执行(通常是输入^C)
Exception     常规错误的基类
StopIteration 迭代器没有更多的值
GeneratorExit    生成器(generator)发生异常来通知退出
StandardError   所有的内建标准异常的基类
ArithmeticError   所有数值计算错误的基类
FloatingPointError 浮点计算错误
OverflowError    数值运算超出最大限制
ZeroDivisionError 除(或取模)零 (所有数据类型)
AssertionError    断言语句失败
AttributeError    对象没有这个属性
EOFError      没有内建输入,到达EOF 标记
EnvironmentError  操作系统错误的基类
IOError    输入/输出操作失败
OSError    操作系统错误
WindowsError   系统调用失败
ImportError  导入模块/对象失败
LookupError  无效数据查询的基类
IndexError   序列中没有此索引(index)
KeyError     映射中没有这个键
MemoryError  内存溢出错误(对于Python 解释器不是致命的)
NameError   未声明/初始化对象 (没有属性)
UnboundLocalError 访问未初始化的本地变量
ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError   一般的运行时错误
NotImplementedError 尚未实现的方法
SyntaxError Python 语法错误
IndentationError   缩进错误
TabError Tab  和空格混用
SystemError     一般的解释器系统错误
TypeError    对类型无效的操作
ValueError       传入无效的参数
UnicodeError Unicode     相关的错误
UnicodeDecodeError Unicode   解码时的错误
UnicodeEncodeError Unicode   编码时错误
UnicodeTranslateError Unicode   转换时错误
Warning            警告的基类
DeprecationWarning      关于被弃用的特征的警告
FutureWarning        关于构造将来语义会有改变的警告
OverflowWarning        旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning   关于特性将会被废弃的警告
RuntimeWarning        可疑的运行时行为(runtime behavior)的警告
SyntaxWarning         可疑的语法的警告
UserWarning        用户代码生成的警告