文件操作
读取文件
# 文件的读取
infile = open('./demo.txt', 'r') # 以读取模式打开文件,返回文件对象
# 读取文件对象后,如果不先关闭再重新打开该文件,则无法再次遍历该文件。\
# 或者使用seek函数把文件中的游标设置文件开头再进行遍历
# for循环遍历文件对象,每次读取一行,读取的内容包含换行符\n
for line in infile:
print(line.strip('\n'), end='; ')
print()
# 逐行读取文件
infile.seek(0) # 设置文件游标的位置,即开始读取的位置
line = infile.readline() # 读取一行,返回读取的内容及行尾的换行符\n
while line != '': # 当readline读取到文件结尾时返回空字符串
print(line.strip('\n'), end='; ')
line = infile.readline()
print()
# 读取指定个数的字符,空格、换行符\n等算1个字符
infile.seek(2)
print('当前游标位置:', infile.tell())
char = infile.read(3)
print(char)
# 一次读取整个文件,返回一个列表,每行内容和换行符\n作为一个元素
infile.seek(0)
ls = infile.readlines()
print(ls)
infile.close()
写入文件
# 文件的写入
# 以覆盖写入模式打开文件,若文件已存在,会将原文件清空再写入;否则创建新文件写入
outfile = open('./demo.txt', 'w')
# 以追加写入模式打开文件,若文件已存在,在原文件末尾写入;否则创建新文件写入
outfile1 = open('./demo1.txt', 'a')
ls = list(range(10))
for i in range(10):
outfile.write(str(i)+'\n') # write方法的参数只能时字符串,且需要显示输入换行符\n
outfile1.write(str(i)+'\n')
outfile.close()
outfile1.close()
with语句
# with语句
ls = [1.56, 2.13]
with open('./demo.txt', 'w') as outfile: # 执行完with语句块或出现异常时都会自动关闭文件
for i in ls:
v = round(i, 1) # 保留一位小数
outfile.write(str(v)+'\n') # 写入文件
flush方法
"""
flush函数用于清空存放写入文件的缓冲区。
向文件中写入数据时,数据先暂时被放在缓冲区,并没有立即写入文件中,等到适当的时候
才一次性写入文件。使用flush函数可以强制立即把缓冲区的数据写入到文件中。
"""
file = open("./demo/flush_test.txt", "w")
for i in range(10):
file.write(str(i) + "\n")
file.flush()
file.close()
输入输出重定向
输入输出重定向,在操作系统命令行使用尖括号<、>实现。
如果有大量数据需要输入,先把数据存在文件中,然后在操作系统命令行(终端)输入
命令来输入数据。
输入重定向,
python demo.py < input.txt
输入输出重定向,
python demo.py < input.txt > output.txt
异常处理
raise抛出异常
# 当程序被执行时可能出现异常时,在可能出现异常的地方主动抛出异常,避免程序崩溃
def divide(a, b):
if b == 0:
raise ValueError("除数不能为0!") # 括号中字符串为对异常的描述
return a / b
处理异常
"""
try-except语句捕获并处理异常。
try语句块用来捕获异常,当发生异常后,不再执行之后的语句。
然后查找对应的异常处理器except,有对应异常处理器时则执行异常处理语句。
当异常信息与设置的异常处理器except不匹配时,程序仍会抛出异常。
当有多个异常处理器时,越具体的异常处理器越放到前面,越一般的越往后放。
"""
try:
file = open('./demo11.txt', 'r')
for line in file:
v = int(line)
print(v)
except IOError as exception: # 指定处理IOError异常,\
# 用关键字as把异常对象存在在变量exception,从而获得异常信息
print('文件不存在!', exception)
except ValueError as exception: # 指定处理ValueError异常
print('无法转换为整数!', exception)
except: # 不指定异常种类,处理所有异常
print('程序有异常!')
"""
文件操作时一定要关闭打开的文件,如果在写入时发生异常,导致不能关闭文件,则内容并没有
真正的写入文件,只有关闭文件才能写入到文件。
使用finall语句可以确保执行关闭文件的命令。
如果需要执行类似关闭文件的清理类工作,都应该使用finall语句,以确保无论程序是否出现
异常都会执行清理工作。
"""
ls = [1.56, 2.13, 'a']
file = open('./demo1.txt', 'w')
try:
for i in ls:
v = round(i, 1) # 保留一位小数
file.write(str(v)+'\n') # 写入文件
except TypeError as exception:
print(exception)
finally: # 不论是否发生异常该语句都会执行
file.close()
print('文件已关闭!')
assert抛出异常
"""
assert语句只应在调试时使用,不应在生产环境中使用,因为它们可以轻易地被全局禁用,从而引入不易发现的错误。
在生产环境中,应使用raise语句异常处理。
在调试时,assert expression,当expression为False时抛出AssertError异常,为True时正常执行。
相当于,
if not expression:
raise AssertionError
"""
def is_in_container(i):
ls = [1, 2, 3]
assert i in ls, "item not in container"
try:
is_in_container(10)
except AssertionError as exception:
print(exception)