Python学习笔记 28

文件操作①

本节里包含有:

  • 使用python对文件进行打开,关闭,读取,写入操作。
打开,关闭文件操作,with语句的使用,常用对文件进行操作的方法模式:

在创建同级和上级目录下创建几个demo.txt文本文件

# 文件操作(file),又叫 I/O 操作
# 计算机里一切皆文件
# 通过python程序来对计算机中的各种文件进行增删改查的操作
# 步骤:
# 	1. 打开文件
# 	2. 对文件进行操作,然后保存
# 	3. 关闭文件

# 打开文件
# open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
# 参数:
#     file 要打开的文件的名字(路径)
# 返回值:
#     返回一个对象,这个对象就代表了当前打开的文件

# 目标文件和当前文件在同一级目录下,直接使用文件名
file_name = 'demo.txt'

# 目标文件不在同级目录下,写出完整路径
# 在Windows系统表示路径时应该使用\,但在python里\代表转义字符,可以用 / 来代替 \ 
file_name = 'text/demo2.txt'
# 或者用 \\ 来代替 \
file_name = 'text\\demo2.txt'
# 或者可以使用原始字符串 r''( 自动忽略转义字符 \ )
file_name = r'text\demo2.txt'

# ..可以用来返回一级目录
file_name = '../demo3.txt'

# 如果距离较远直接使用绝对路径
file_name = 'E:/Python/练习文件/06.异常和文件/demo.txt'

open(file_name)
# 不报错说明已经打开成功了
file_obj = open(file_name) 
print( file_obj )

# 当我们获取到文件对象后,所有对文件的操作都应该通过对象进行
# read( ) 方法,读取文件内容,将它的内容全部作为一个字符串返回
content = file_obj.read( )
print(content,type(content))

# 关闭文件
# close( )方法直接关闭

file_obj.close()

# content = file_obj.read( )
# print(content)

print('- '*40)

# with 语句:
# with ... as ... :
#	   代码块
with open(file_name) as file_obj : # 等价于file_obj = open(file_name) 
	# 此时这个文件只能在with中使用,with 结束时文件会自动close( )
	print(file_obj.read())

print('- '*40)

file_name = 'ro.txt'
try:
	with open(file_name) as file_obj : 
		print(file_obj.read())
except FileNotFoundError :
		print(f'{file_name}文件不存在。。。')

读取文件:

分别使用read( ),readline( ),readlines( ),for循环方法读取文件
在读取中文文件时,要将open方法里的encoding参数设置为 utf-8,总体来说使用for循环读取相对简单

import pprint

file_name = 'demo2.txt'
try:
	# 调用open( )打开文件,可以将文件分为两种类型
	# 	1. 纯文本文件(使用utf-8等编码编写的文本文件)
	# 	2. 二进制文件(图片,mp3,ppt等这些文件)
	# open( )默认以文本文件的形式打开的,但默认的编码是None,
	#     所以处理文本文件时,必须指定文件的编码
	with open( file_name , encoding = 'utf-8' ) as file_obj : 
		# 通过read读取时它会将全部文件内容一次性读取出来,如果文件过大容易造成内存泄漏
		# read( n )可以接收一个size作为参数,该参数用来指定要读取的*字符*(整个字)的数量
		#     默认值为-1,它会读取文件中的所有字符
		#     每一次读取都是从上一次读取到的位置开始的
		#     如果字符的数量小于size,则会读取剩余的所有的,
		#     如果文件已经读取到最后了,则会返回空串

		# help(file_obj.read)
		content = file_obj.read(6)
		print( content )
		content = file_obj.read(7)
		print( content )
		content = file_obj.read(6)
		print( content )
		content = file_obj.read(6)
		print( content )

except FileNotFoundError :
		print(f'{file_name}文件不存在。。。')

print('- '*40)

# 读取大文件时常用流程:

file_name = 'demo.txt'
try:
	with open( file_name , encoding = 'utf-8' ) as file_obj : 
		file_content = '' # 保存文件的内容
		chunk = 100 # 每次读取的字符数量
		while True :
			content = file_obj.read(chunk)
			# print(content,end ='')
			if  not content :
				# 读取完毕
				break

			file_content += content

except FileNotFoundError :
		print(f'{file_name}文件不存在。。。')

print(file_content)


print('- '*40)

# readline( )
# 该方法可以读一行内容
file_name = 'demo.txt'
try:
	with open( file_name , encoding = 'utf-8' ) as file_obj : 
			print(file_obj.readline( ),end = '')
			print(file_obj.readline( ),end = '')
			print(file_obj.readline( ),end = '')

except FileNotFoundError :
		print(f'{file_name}文件不存在。。。')

print('- '*40)

# readlines( )
# 该方法会一次性读取内容,并且封装到一个列表中返回
file_name = 'demo.txt'
try:
	with open( file_name , encoding = 'utf-8' ) as file_obj : 
			r = file_obj.readlines( )
			# pprint.pprint(r)
			print(r[0],end = '')
			print(r[1],end = '')
			print(r[2])

except FileNotFoundError :
		print(f'{file_name}文件不存在。。。')

print('- '*40)

# for循环,最简单

file_name = 'demo.txt'
try:
	with open( file_name , encoding = 'utf-8' ) as file_obj : 
		for t in file_obj:
			print(t,end = '')

except FileNotFoundError :
		print(f'{file_name}文件不存在。。。')


写入文件

write( )方法,open( )的mode参数,r,w,a,x及r+,w+,a+

这部分读取的时候遇到了小问题,自己在网上找到seek() 方法,能解决读的问题,第一次调用没问题,但再次调用就会出现问题,可能是动了指针的位置导致找不到文件

file_name = 'demo.txt'

# 使用open( )打开文件时必须指定打开文件所要做的操作(读,写,追加)
# 如果不指定操作类型,则默认是读取文件,
# r 表示只读
# w 表示可写的,如果文件不存在则会创建文件,如果文件存在则会清空文件,之后再写入
# a 表示追加内容,如果文件不存在则会创建文件,如果文件存在则会向末尾追加内容
# x 表示新建,如果文件不存在则创建,存在则报错
# + 为操作符增加功能
#     r+ 即可读又可写, 如果文件不存在不会创建新文件,会报错,
#         如果文件使用write( )方法时则会从开头覆盖文件,按字节逐个覆盖,覆盖写
#         例①
#     w+ 在w的基础上增加了可读功能
#         例②
#     a+ 在a的基础上增加了可读功能
#         例③

# with open(file_name , 'w' , encoding = 'utf-8') as file_obj:
with open(file_name , 'a' , encoding = 'utf-8') as file_obj:
	# write( )方法是向文件中写入内容
	# 如果操作的是一个文本文件,则write( )需要传递一个字符串作为参数
	# 有int类型返回值,写入完成后,该方法会返回写入的字符的个数
	file_obj.write('\n任天堂')
	n = file_obj.write('\n天高任我飞')
	print(n)

print('- '*20,'我是华丽的分割线',' -'*20)

# 例①
with open(file_name , 'r+' , encoding = 'utf-8') as file_obj:
	file_obj.write('任天堂')
	# 从开头覆盖写入
	file_obj.write('天高任我飞')
	# 此时指针在 '飞' 的后面,如果直接读就会从指针位置往后读到结尾,前面写入的就不会读到
	# 所以需要重新调整指针位置
	# seek函数:
	#     seek(offset[, whence]) ,offset是相对于某个位置的偏移量。位置由whence决定,
	#     默认whence=0,从开头起;whence=1,从当前位置算起;
	#     whence=2相对于文件末尾移动,通常offset取负值。
	file_obj.seek(0) # 此时指针在开头处,可以正常读取
	print( file_obj.read( ) )

print('- '*20,'我是华丽的分割线',' -'*20)

# 例②
with open(file_name , 'w+' , encoding = 'utf-8') as file_obj:

	file_obj.write('我是w+。。')
	file_obj.seek(0) # 将指针调整到开头处
	print( file_obj.read( ) )

print('- '*20,'我是华丽的分割线',' -'*20)

# 例③
with open(file_name , 'a+' , encoding = 'utf-8') as file_obj:

	file_obj.write('我是a+。。。')
	file_obj.seek(0) # 将指针调整到开头处
	print( file_obj.read( ) )


猜你喜欢

转载自blog.csdn.net/weixin_44011689/article/details/90113909