Python之文件的操作
- 操作文件之读文件
第一种:
f = open(r'd:\python\test\a.txt', 'r', encoding='utf8')
print(f.read())
f.close()
此种方法在调用以后,必须加一个close()方法,否则文件会占用你的内存,如果打开文件太多,内存会被撑暴。
第二种:
with open(r'd:\python\test\a.txt', 'r', encoding='utf8') as f:
print(f.read())
此种方法在调用以后,不需要加close()方法,with会自动在调用完成以后关闭文件。建议使用这个方法。
统一说明:
两种方法中的open中的内容解释:
open(r'd:\python\test\a.txt', 'r', encoding='utf8')
'''
路径前的 r'路径' 指的是:
这里的r的意思是转译,因为在python中(别的语言也有这种情况),\n \r等很多这种组合都有自己的含意,在开头加上r以后,就是告诉解释器,不要使用这些特殊的含意。
encoding前的r的意思是只读,这里除了r以外,还可以使用其它参数:
r(只读) w(只写) a(只追加)
rb(二进制读) wb(二进制写) ab(二进制追加) 注意二进制后面不能加encoding参数
encoding的意思是,告诉解释器,我们用的是哪个字符集
'''
- 操作文件之写文件
with open(r'a.txt', 'w', encoding='utf8') as f:
f.write('Hello World, I am W!')
注意:w参数是“覆盖写入”,也就是每次写入文件时,会先将文件清空,再将新的数据写入到文件中。
- 操作文件之追加文件
with open(r'a.txt', 'a', encoding='utf8') as f:
f.write('I am appending! 22222')
注意:a参数是“追加写入”,每次写入数据时,会将数据追加至文章尾部,但追加的数据不会自动加换行符,需要自己手工去添加。
文件操作模式
文件操作模式指的就是上面所写的“读取、写入、追加”三个操作,它们对应的参数是“r/w/a”。
t 文件模式
文件模式为默认的模式,上面所写的"r/w/a"三个模式其实全是"rt/wt/at",但是默认模式可以忽略结尾的t
特点:
- 只能操作文本文件
- 读写都是以字符为单位
- 需要指定encoding参数,如果不加参数则会采用计算机默认编码。
b 二进制模式
二进制模式需要自己指定,指定方法就是在"r/w/a"结尾加上字母b(bytes的缩写),如“rb/wb/ab”
- 可以操作任意类型的文件
- 读写都是以bytes为单位
- 不需要指定encoding参数,因为它已经是二进制模式了
- 如果要看实际内容,需要根据源文件的编码进行解码
文件之方法与操作
- read()
说明:
文件读取之光标问题说明:
当文件第一次打开时,光标会停留在文件开头
第一次print的时候,光标会根据字符进行移动,如果未指定,会移动到文件结尾。
在文件未close之前,光标会一直停留在文件结尾
此时如果再print,则不会再读取出数据来,因为光标已经在文件结尾了
'''
假设,我们有个文件 a.txt,内容为:
我是第一行
我是第二行
我是第三行
我是第四行
'''
# 这时我想将文件读取三遍,我们想的是会返回三遍,但是注意,执行完以后,文件只会返回一遍
with open(r'd:\python\a.txt', 'r', encoding='utf8') as f:
print(f.read()) # 这时光标停留在“我是第四行”的结尾
print(f.read()) # 文件还未close,光标还在文件结尾,再读取时,光标继续向右读内容,但光标右侧已经没有内容了,所以会返回空值。
print(f.read()) # 原理同上
文件读取还可以设定读取的字符数量,注意不是按字节数,是按字符。如:
'''
根据以下验证可以得出,虽然数字、字母占用的字节数小,但返回值并不是按字节算的。
文件内容如下:
1a我的
'''
with open(r'd:\study\oldboy\day05\a.txt', 'r', encoding='utf8') as f:
print(f.read(1)) # 返回 1
with open(r'd:\study\oldboy\day05\a.txt', 'r', encoding='utf8') as f:
print(f.read(2)) # 返回 1a
with open(r'd:\study\oldboy\day05\a.txt', 'r', encoding='utf8') as f:
print(f.read(3)) # 返回 1a我
with open(r'd:\study\oldboy\day05\a.txt', 'r', encoding='utf8') as f:
print(f.read(4)) # 返回 1a我的
最后注意:
read()方法中如果不加字符数量的话,默认是读取整个文件的内容,如果文件太大,比如几十G的日志,会把内存撑爆。
- readline()
一次只读取一行内容
'''
文件内容:
我是第一行
我是第二行
我是第三行
'''
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f.readline()) # 只会返回“我是第一行”,如果想读取第二行需要再加一个print(f.readline())
- readlines()
文件会以列表的形式返回值,但注意会输出换行符。
'''
文件内容:
我是第一行
我是第二行
我是第三行
'''
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f.readlines())
# 返回值中有换行符\n
# ['我是第一行\n', '我是第二行\n', '我是第三行\n']
- readable()
查询文件是否可读,会返回布尔值
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f.readable()) # 返回 True
- write()
写入,上面已作过使用方法,此处不再重复介绍。
- writeable()
查看文件是否可写,返回布尔值
- writelines()
接收一个列表,一次性将列表中的数据值写入
l1 = ['1.我是第一行', '2.我是第二行', '3.我是第三行', '4.我是第四行']
print(l1)
with open(r'a.txt', 'w', encoding='utf8') as f:
f.writelines(l1)
# 返回:1.我是第一行2.我是第二行3.我是第三行4.我是第四行
# 所以,如果要换行,需要手工在结尾加\n
- flush()
将内存中的数据,刷到硬盘
文件内的光标移动
根据上面的read()方法可以知道,读取完内容后光标会默认移动到结尾,那么,如何将光标移动回来呢?
使用方法:seek()
with open(r'a.txt', 'w', encoding='utf8') as f:
f.write('123456\n')
f.write('我是第二行\n')
f.write('我是第三行')
with open(r'a.txt', 'r', encoding='utf8') as f:
f.seek(4)
print(f.read())
'''
返回值:
56 --->这里可以看到,光标移动了四个字节
我是第二行
我是第三行
'''
seek(offset, whence)
offset是位移量 以字节为单位
whence是模式,模式分为 0 1 2
0 是指基于文件开头(光标在文件开头,再向右移动多少字节数),文本和二进制都可以使用
1 是指基于当前位置(光标在当前位置,再移动多少字节数),只有二进制模式使用
2 是指基于文件末尾(一般搭配seek(-n)使用,-n就是向左移动多少bytes),只有二进制模式使用
注意:光标移动是按bytes字节数来算的,
文件的二进制操作(编码与解码)
encode() 编码:将字符编译为bytes模式
decode() 解码:将bytes模式解码为指定字符
with open(r'a.txt', 'w', encoding='utf8') as f:
f.write('123456\n')
f.write('我是第二行\n')
f.write('我是第三行')
with open(r'a.txt', 'rb') as f:
print(f.read())
'''
返回:
b'123456\r\n\xe6\x88\x91\xe6\x98\xaf\xe7\xac\xac\xe4\xba\x8c\xe8\xa1\x8c\r\n\xe6\x88\x91\xe6\x98\xaf\xe7\xac\xac\xe4\xb8\x89\xe8\xa1\x8c'
'''
使用进进制写入文件
s1 = '周末去哪玩?'.encode('utf8')
print(s1)
b'\xe5\x91\xa8\xe6\x9c\xab\xe5\x8e\xbb\xe5\x93\xaa\xe7\x8e\xa9\xef\xbc\x9f'
# 接下来将这个bytes类型写入到文件中
s1 = '周末去哪玩?'.encode('utf8')
with open(r'a.txt', 'wb') as f:
f.write(s1)
with open(r'a.txt', 'rb') as f:
print(f.read())
# 返回:b'\xe5\x91\xa8\xe6\x9c\xab\xe5\x8e\xbb\xe5\x93\xaa\xe7\x8e\xa9\xef\xbc\x9f'
# 读取也是二进制,那如何查看内容呢?使用解码。
with open(r'a.txt', 'rb') as f:
print(f.read().decode(encoding='utf8'))
标签:文件,encoding,Python,utf8,print,操作,txt,open
From: https://www.cnblogs.com/smyz/p/16941073.html