python文件常用操作

相对路径和绝对路径

绝对路径:从根目录开始/
相对路径:当前目录为:“C:\Windows\System32”,目录下有个文件test.txt,他的相对路径就是.\test.txt(.\表示当前所在目录)

文件操作

  • 删除、修改权限:作用于文件本身,属于系统级操作
  • 写入、读取:对于文件内容的操作,属于应用级操作
  • 文件操作步骤:
    1、打开文件open()
    2、读取文件read()、readline()、readlines()/写入文件write()
    3、关闭文件close(),不管读写,最后一定要关闭文件

open()函数

  • 格式:f=open(‘filename.txt’,mode=‘r’,encoding=None)
    打开的文件名字,以及打开方式,及设置的编码格式,不指定打开方式,默认是read模式
    • mode=r
      以只读的方式打开文件
    • mode=rb
      以二进制格式、采用只读的方式打开文件,一般用于图片、音频文件
    • mode=r+
      属于加模式,可读可写,其中写就是追加模式
    • mode=w
      以只写方式打开文件,如果文件存在,会清空文件原有内容
    • mode=wb
      以二进制格式、只写方式打开文件,用于非文本文件,如音频文件
    • mode=w+
      以读写模式打开文件,打开文件时会清空文件内容,读就属于追加模式
    • mode=a
      属于加模式,以只写方式打开文件,文件如果不存在,则创建新文件,若文件存在则追加到文件末尾
  • mode=ab
    以二进制格式打开文件,并采用追加模式,对文件只有写权限,文件如果不存在,则创建新文件,若文件存在则追加到文件末尾
  • mode=a+
    以读写模式打开文件,文件如果不存在,则创建新文件,若文件存在则追加到文件末尾

read()函数

  • read()
    格式:file.read([size])
    不加参数则读取全部内容,加size参数则按字节读取
#可只写文件名,其他默认,文件名如不在同一路径下,需写绝对路径
f1 = open('test.txt', 'r', encoding='utf-8')
print(f1.read())
print(f1.read(3))
print(f1.read(3))
#最重要一定要关闭文件,不然会占用资源
f1.close()

read()函数读取过程中提示UnicodeDecodeError异常或者显示为乱码,编码格式和open()函数打开文件的编码格式不一致

  • readline()
    格式:file.readline([size])
    按行读取文件内容,包括换行符‘\n’,size参数是指定一行中读取的字节数
f1 = open('test.txt', 'r', encoding='utf-8')
print(f1.readline())
print(f1.readline(2))
f1.close()
  • readlines()
    格式:file.readlines()
    读取文件中的所有行,readlines直接读取出来的是一个list常和for循环一起使用
f1 = open('test.txt', 'r', encoding='utf-8')
rl1 = f1.readlines()
for i in rl1:
	print(i)
#rl2 = f1.readlines()
#print(rl2)
f1.close()

大文件读取

open()函数和read()函数读取文件,会一次性读取全部内容,只适合读取小文件,如果文件过大,会造成内存溢出
windows下创建大文件的方法:
fsutil file createNew C:\user\xx\test.txt 1024

write()函数

  • write()函数
    语法:file.write(string)
    写入字符串
f_w = open('writetest.txt','w')
print(f_w.write('I miss you,\nbut i miss you'))
f_w.close()

  • writelines()函数
    语法:file.writelines()
    可以写入字符串列表
#writelines可以将一个文件中的内容复制到其他文件
fr = open('test.txt','r',encoding='utf-8')
fr1 = fr.read()
fw = open('rwtest.txt','w',encoding='utf-8')
fw.writelines(fr1)
fr.close()
fw.close()
  • seek()函数
    file.seek(offset,[,whence])
    offset–偏移量(支持正数(向后偏移)、负数(向前偏移))
    whence–文件指针位置(0-文件开始,1-当前位置,2-文件尾)
    移动文件指针到指定位置
  • tell()函数
    判断文件当前指针位置
#tell()
f1 = open('test.txt', 'r', encoding='utf-8')
print(f1.read(3))
print(f1.tell())
f1.close()

#seek()使用seek函数,如果不是以二进制模式打开的话,是只允许从开头位置读取文件
f1 = open('test.txt', 'rb')
print(f1.read(3))
print(f1.tell())
f1.seek(5,2)
print(f1.tell())
print(f1.read(6))
  • with as 读写文件
    with as语句会自动分配资源和释放资源
    语法:with 表达式[as target]:
    代码块
with open('test.txt','w',encoding='utf-8') as f:
	f.write('write something')
	f.writelines('write a dog\nwrite a cat\nwrite a bird')


with open('test.txt','r') as r:
	r1 = r.readlines()
	for i in r1:
		print(i)
  • fileinput模块 逐行读取多个文件
import fileinput
# print(dir(fileinput))

#inplace=True:如果有改动要将改动写到原文件,backup:是指定备份文件的扩展名,inplace和openhook不能一起使用,不然会报错:valueError
for line in fileinput.input(files=('test.txt', 'rwtest.txt'),inplace=True,backup='.bak'):
	print(line.replace('w','W'))
fileinput.close()

# # 使用for循环遍历 fileinput 对象
for line in fileinput.input(files=('test.txt', 'rwtest.txt')):
    # 输出读取到的内容
    print(line,end='')
# 关闭文件流
fileinput.close()
  • linecache()模块 读取文件指定行
import linecache
# print(dir(linecache))

print(linecache.getline('test.txt',5))
#print(linecache.getlines('test.txt'))

python常见异常类型

  • 语法错误–即解析代码时发生的错误(syntaxError)
  • 运行错误–即语法正确,运行时发生了错误,我们把运行时发生的错误叫异常(Exceptions)

异常类型

AssertionError assert关键字后面的条件为假时,程序停止运行且抛出的
异常
AttributeError 当访问对象属性不存在时抛出的异常
IndexError 索引超出序列范围
KeyError 字典中查找一个不存在的关键字
NameError 访问一个没有被申明的变量时引发的异常
ValueError 传入一个不被期望的值,即 传入类型不正确
TypeError 不同数据类型直接的无效操作
ZeroDivisionError 除法运算中除数为0引发的异常
ImportError 无法引入包
IOError 输入输出异常,文件操作

捕获异常

语法:try:
可能产生异常的代码块
except [(error1,error2) [as e]]:
处理产生异常的代码块
except [(error1,error2) [as e]]:
处理产生异常的代码块
except Exception:
处理其他异常
异常相关的关键字:
try/except–捕获异常并处理
pass–忽略异常
as–定义异常实例(except NameError as e)
else–如果try中语句没有引发异常,那就处理else中的代码块
finally–资源回收机制,无论是否出现异常都处理的代码块
raise–引发/抛出异常

try:
	a = 'haha'
	print(a[9])
except Exception as err:
	print('索引超出范围:{}'.format(err))

try except捕获了异常,但是不知道哪里出现了问题,是语法问题还是数据类型的问题可以用except Exception as err把错误打印出来,方便定位问题
还可以先不加异常,先执行代码块,把可能会出现的异常加到except中

try:
	a = int(input('请输入一个整数: '))
	b = int(input('请输入一个整数: '))
	c = a/b
except ValueError as e:
	print('输入的值有误: {}'.format(e.args))
except ZeroDivisionError as e:
	print('输入的值有误: {}'.format(e.args))
except Exception as err:
	print('未知异常')
else:
	print('运算结果为:%s' % c)
finally:
	print('程序结束')

抛出异常

raise一般和条件语句一起使用。
语法:raise[exceptionName (reason)]
raise的用法有三种:

  • 单独一个raise,引发当前上下文中捕获的异常
  • raise异常类名称,表示引发执行类型的异常
  • raise异常类名称(描述信息),在引发指定异常类型的时候,附带异常信息
#repr()可以把raise后面的信息打印出来
try:
	pwd = str(input('请输入密码:'))
	if len(pwd) < 8:
		raise ValueError('密码不能小于8位')
	elif len(pwd) > 16:
		raise ValueError('密码不能超过16位')
	else:
		print('输入正确')
except ValueError as e:
	print('请输入正确的密码位数',repr(e))

traceback模块

  • traceback模块中的traceback.print_exc()可以将异常的传播轨迹打印到控制台或指定文件
  • format_exc()返回一个字符串
import traceback
try:
	print(1/0)
except Exception as e:
	print(traceback.print_exc)
	error = traceback.format_exc()
	print(error)
上一篇:Java向上转型


下一篇:JLU数据结构上机实验6