1 文件操作
1.1 文件读写操作
文件读、写操作比较常见。这里,学习在python中如何进行文件读写。
1.1.1文件读操作
读取文件,要先判断文件是否存在。如果文件存在,则正常进行读取,否则抛出文件不存在的异常。
- 打开文件
open(file, mode='r', encoding=None, ...)
参数说明:
file
: 必需,文件路径(相对或者绝对路径)。
mode
: 可选,文件打开模式。
encoding
: 编码方式,一般使用utf8。
常用的mode参数:
mode='r':以只读方式打开文件,文件的指针将会放在文件的开头。(默认模式)
mode='w':打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
mode='a':打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
mode='+':可读写模式,可与其他模式等配合使用,如'r+'、'w+'、'a+'等。
- 读取文件内容
使用open()
打开文件,返回一个文件对象fileObject
。
fileObject.readlines()
:一次性读取文件所有内容,并返回一个列表。
f = open("E:/WorkSpace/test.txt", 'r')
lines = f.readlines()
print(lines)
f.close()
# 输出 由每行字符串构成列表
['Beautiful is better than ugly.n', 'Explicit is better than implicit.n', 'Simple is better than complex.n', 'Complex is better than complicated.n', 'Flat is better than nested.n', 'Sparse is better than dense.n']
fileObject.readline()
:一次读取文件一行,能解决大文件读取内存溢出问题。
f = open("E:/WorkSpace/test.txt", 'r')
while True:
line = f.readline()
if line:
print(type(line), line)
else:
break
f.close()
# 输出
<class 'str'> Beautiful is better than ugly.
<class 'str'> Explicit is better than implicit.
<class 'str'> Simple is better than complex.
<class 'str'> Complex is better than complicated.
<class 'str'> Flat is better than nested.
<class 'str'> Sparse is better than dense.
fileObject.read()
:读取整个文件,将文件内容放到一个字符串变量中。
f = open("E:/WorkSpace/test.txt", 'r')
text = f.read()
print(type(text), text)
f.close()
# 输出
<class 'str'> Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
fileObject.close()
:用于关闭一个已打开的文件,关闭后的文件不能再进行读写操作。
1.1.2 文件写操作
如果想向文件中写入内容,打开文件open()
的模式mode
可以设置为'w'
或'w+'
。
- fileObject.write(str):用于向文件中写入指定字符串,返回的是写入的字符长度。
f = open("E:/WorkSpace/test.txt", 'w')
content = "Simple is better than complex"
print(f.write(content))
f.close()
# 输出
29
- fileObject.writelines():向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符
n
。
f = open("E:/WorkSpace/test.txt", 'w')
str_list = ['Simple is better than complexn', 'Explicit is better than implicit']
f.writelines(str_list)
f.close()
1.1.3 with语句读取文件
在读写文件时,我们经常使用with语句,可以保证在文件操作后会自动关闭打开的文件。
with open("E:/WorkSpace/test.txt", 'r') as f:
for line in f.readlines():
print(line)
# 输出
Simple is better than complex
Explicit is better than implicit
1.2 os模块中文件/目录方法
1.2.1 os.getcwd()
返回当前工作目录。
import os
print(os.getcwd())
# 输出
E:WorkSpace
1.2.2 os.chdir(path)
用于改变当前工作目录到指定的路径。
import os
print(os.getcwd()) # 当前目录
os.chdir('E:WorkSpaceEffectivePython') # 切换到新路径
print(os.getcwd()) # 新路径
# 输出
E:WorkSpace
E:WorkSpaceEffectivePython
1.2.3 os.listdir(path)
返回path路径下包含的文件或文件夹的名字的列表。
import os
path = "E:/WorkSpace/EffectivePython"
dirs = os.listdir(path)
for file in dirs:
print(file)
# 输出
.git
.gitignore
.vscode
build
make.bat
Makefile
README.md
source
1.2.4 os.mkdir(path)
创建单层目录,如果该目录已存在抛出异常。
import os
os.mkdir('E:/WorkSpace')
# 输出
FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: 'E:/WorkSpace'
import os
os.mkdir('E:/WorkSpace/subWorkSpace')
1.2.5 os.makedirs(path)
用于递归创建多层目录,如果该目录已存在抛出异常。
import os
os.makedirs('E:/WorkSpace/subWorkSpace1/subWorkSpace2')
1.2.6 os.remove(path)
用于删除指定路径的文件。如果指定的路径是一个目录,将抛出 OSError
。
import os
os.remove('E:/WorkSpace/test.txt')
1.2.7 os.rmdir(path)
用于删除单层目录,仅当这文件夹是空的才可以, 否则, 抛出OSError。
import os
os.rmdir('E:/WorkSpace/subWorkSpace1/subWorkSpace2') # 仅删除subWorkSpace2
1.2.8 os.removedirs(path)
递归删除目录,从子目录到父目录逐层尝试删除,遇到目录非空则抛出异常。
import os
os.removedirs('E:/WorkSpace/subWorkSpace1/subWorkSpace2') # 删除/subWorkSpace1/subWorkSpace2
1.2.9 os.rename(src, dst)
用于命名文件或目录,从 src 到 dst,如果dst是一个存在的目录, 将抛出OSError。src 为要修改的目录名,dst是修改后的目录名。
import os
os.rename('./subWorkSpace1/subWorkSpace2', './subWorkSpace1/subWorkSpace3') # subWorkSpace2重命名为subWorkSpace3
1.2.10 os.path模块
该模块主要用于获取文件的属性。
- os.path.basename(path):返回文件名
- os.path.abspath(path):返回绝对路径
- os.path.dirname(path):返回文件路径
- os.path.exists(path):判断指定路径(目录或文件)是否存在。
- os.path.isabs(path):判断是否为绝对路径
- os.path.isfile(path):判断路径是否为文件
- os.path.isdir(path):判断路径是否为目录
- os.path.samefile(path1, path2): 判断path1和path2是否相同
- os.path.join(path1[, path2[, ...]]):将
path1
和path2
各部分组合成一个路径名 - os.path.split(path):把路径path分割成文件路径和文件名,并返回一个
(file_path, file_name)
元组。如果完全使用目录,它会将最后一个目录作为文件名分离,且不会判断文件或者目录是否存在。 - os.path.splitext(path):分离文件名与扩展名,返回路径名和文件扩展名的元组。
import os
print(os.path.basename(r'E:WorkSpacesubWorkSpace1subWorkSpace2test.txt'))
print(os.path.abspath(r'E:WorkSpacesubWorkSpace1subWorkSpace2test.txt'))
print(os.path.dirname(r'E:WorkSpacesubWorkSpace1subWorkSpace2test.txt'))
print(os.path.exists(r'E:WorkSpacesubWorkSpace1subWorkSpace2test1.txt'))
print(os.path.isabs(r'E:WorkSpacesubWorkSpace1subWorkSpace2'))
print(os.path.isfile(r'E:WorkSpacesubWorkSpace1subWorkSpace2test.txt'))
print(os.path.isdir(r'E:WorkSpacesubWorkSpace1subWorkSpace2'))
print(os.path.samefile(r'E:WorkSpacesubWorkSpace1subWorkSpace2', r'E:WorkSpacesubWorkSpace1subWorkSpace3'))
print(os.path.join(r'E:WorkSpacesubWorkSpace1subWorkSpace3', 'test.txt'))
print(os.path.split(r'E:WorkSpacesubWorkSpace1subWorkSpace2test.txt'))
print(os.path.splitext(r'E:WorkSpacesubWorkSpace1subWorkSpace2test.txt'))
# 输出
test.txt
E:WorkSpacesubWorkSpace1subWorkSpace2test.txt
E:WorkSpacesubWorkSpace1subWorkSpace2
False
True
True
True
False
E:WorkSpacesubWorkSpace1subWorkSpace3test.txt
('E:WorkSpacesubWorkSpace1subWorkSpace2', 'test.txt')
('E:WorkSpacesubWorkSpace1subWorkSpace2test', '.txt')
2 异常处理
异常就是运行期检测到的错误。
2.1 Python 标准异常总结
- BaseException:所有异常的基类
- Exception:所有异常类的基类,但继承BaseException
- AssertionError :断言语句(assert)失败
- AttributeError:尝试访问未知的对象属性
- IOError:输入/输出操作失败
- OSError:操作系统产生的异常
- KeyboardInterrupt:用户中断执行
- ImportError:导入模块失败的时候
- IndexError:索引超出序列的范围
- KeyError:字典中查找一个不存在的关键字
- MemoryError:内存溢出(可通过删除对象释放内存)
- NameError:尝试访问一个不存在的变量
- SyntaxError:语法错误导致的异常
- IndentationError:缩进错误导致的异常
- TypeError:不同类型间的无效操作
- ValueError:传入无效的参数
- UnicodeError:Unicode相关的异常(ValueError的子类)
- UnicodeEncodeError:Unicode编码错误导致的异常(UnicodeError的子类)
- UnicodeDecodeError:Unicode解码时的异常(UnicodeError的子类)
- ZeroDivisionError:除数为零
2.2 Python标准警告总结
- Warning:警告的基类
- DeprecationWarning:关于被弃用的特征的警告
- PendingDeprecationWarning:关于特性将会被废弃的警告
- RuntimeWarning:可疑的运行时行为(runtime behavior)的警告
- SyntaxWarning:可疑语法的警告
- ImportWarning:用于在导入模块过程中触发的警告
- UnicodeWarning:与Unicode相关的警告
- BytesWarning:与字节或字节码相关的警告
- ResourceWarning:与资源使用相关的警告
2.3 异常处理
2.3.1 try - except
try:
执行代码
except Exception as error:
发生异常时执行的代码
工作方式:
- 首先,执行
try
子句。如果没有异常发生,忽略except
子句,try
子句执行后结束。 - 如果在执行
try
子句的过程中发生了异常,那么try
子句余下的部分将被忽略。与异常类型对应的except子句将被执行。 - 如果一个异常没有与任何的
except
匹配,那么这个异常将会传递给上层的try
中。
2.3.2 try-except-else
try:
执行代码
except Exception as error:
发生异常时执行的代码
else:
没有异常时执行的代码
比如,判断文件是否可以打开,如果打开文件时没有发生异常则执行 else 部分的语句,读取文件内容,并关闭打开的文件。
try:
f = open('E:/WorkSpace/test.txt', 'r')
except Exception as err:
print("err: %s"%err)
else:
content = f.readlines()
print(content)
f.close()
2.3.3 try - except - finally
try:
执行代码
except Exception as error:
发生异常时执行的代码
else:
没有异常时执行的代码
finally:
不管有没有异常都会执行的代码
如果一个异常在try
子句里被抛出,而又没有任何的except
把它截住,那么这个异常会在finally
子句执行后被抛出。
def divide(x, y):
try:
result = x / y
print("result is", result)
except ZeroDivisionError:
print("division by zero!")
finally:
print("executing finally clause")
divide(2, 4)
# 输出
result is 0.5
executing finally clause
divide(2, 0)
# 输出
division by zero!
executing finally clause
divide('2', '4')
# 输出
executing finally clause
TypeError: unsupported operand type(s) for /: 'str' and 'str'
2.3.4 抛出异常
使用raise
语句抛出一个指定的异常。
raise [Exception [, args [, traceback]]]
Exception 是异常的类型(例如,NameError)参数标准异常中任一种,args 是自已提供的异常参数。最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象。
--END--