Python篇-文件操作
2018-10-23 本文已影响7人
TianTianBaby223
一 : 文件的基本操作
( 1 )只读
-
打开文件
以utf-8的编码方式打开
f 是 open函数调用操作系统,返回的文件句柄,文件句柄相当于乘载硬盘上的资源的一连同方式在读的时候相当于一个容器,取操作系统的资源
encoding
不写默认是系统的
文件默认打开是只读模式
f = open('22.txt',encoding='utf-8')
print(f.read())
夜来风雨声,
花落知多少.
-
一行一行读文件
f = open('22.txt',encoding='utf-8')
print(f.readline(),end='')
print(f.readline())
夜来风雨声,
花落知多少.
-
readLines
f = open('22.txt',encoding='utf-8')
print(f.readlines())
['夜来风雨声,\n', '花落知多少.\n']
-
关闭文件
使用完毕后需要释放
f.close
( 2 )只写
相当于新建立空文档,覆盖原来的文件,再开始写.
f = open('美美.txt','w',encoding='utf-8')
f.write('1111\n')
f.write('美美美\n')
f.write('哈哈哈哈\n')
f.close()
美美.txt
1111
美美美
哈哈哈哈
-
writable()
是否是可写的
print(f.writable())
True
-
writelines
f.writelines(['555\n','6666\n'])
555
6666
-
文件内容只能是字符串,只能写字符串
f.writelines(['555\n','6666\n',1])
TypeError: write() argument must be str, not int
( 3 )a模式
也是写,只是追加的方式写到文件最后
f = open('美美.txt','a',encoding='utf-8')
f.write('加油啊')
555
6666
加油啊
( 4 )r+模式
既能读,又能写,写操作是在光标处开始覆盖
f = open('美美.txt','r+',encoding='utf-8')
# print(f.read())
f.seek(2)
f.write('zzzdfdf')
文件修改操作模拟
scr_f = open('美美.txt','r',encoding='utf-8')
data = scr_f.readlines()
scr_f.close()
dst_f = open('美美.txt','w',encoding='gbk')
dst_f.writelines(data[0])
dst_f.close()
with 方式
with open('a.txt','w',encoding='uft-8') as f:
f.write('哈哈哈')
with 方式处理多个文件
with open('美美.txt') as f,\
open('a.txt','w') as f2 :
data = f.read()
f2.write(data)
二 : 文件处理b模式
可以处理非文本的骚操作
,实现跨平台
b的模式不能指定编码
( 1 )rb模式
f = open('test','rb')#b的方式不能指定编码
#取出字节
data = f.read()
print(data)
b'\xe4\xbd\xa0\xe6\x98\xaf\xe8\xb0\x81\xe5\x95\x8a,\n\xe5\x95\x8a\xe5\x95\x8a\xe5\x95\x8a\xe5\x95\x8a,\n\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88.'
把文件以字节的方式取出来,解码后可以看到数据
print(data.decode('utf-8'))
( 2 )wb模式
f = open('test1','wb') #b的方式不能指定编码
##把字符串转换为byte类型
f.write(bytes('啦啦',encoding='utf-8'))
f.write('也许'.encode('utf-8'))
( 3 )ab模式
文件的最后一个位置追加
f = open('test1','ab') #b的方式不能指定 编码,文件的最后一个位置追加
f.write('啥玩意'.encode('utf-8'))
f.close()
三 : 文件处理骚操作
f = open('test2','w',encoding='uft-8')
- closed
文件是否关闭
print(f.closed)
- f.encoding
显示文件打开的编码
print(f.encoding)
- f.flush()
将内存数据刷到硬盘上
- f.tell()
光标当前所在位置,返回在第几个字节
注意
read(4)代表读取3个字符,其余的文件内光标移动都是以字节为单位的,如seek,tell,read,truncate
print(f.tell())
- newline
读取文件真正的换行符号
python 会将\r\n处理成\n,newline会让其显示真正的样貌,假如是windows平台使用,newline = ''则会显示\r\n
f = open('b.txt','r',encoding='utf-8',newline='')
f.readline()
- seek
参数是字节
用来控制光标的移动
文件中存的是中文一个字符占三个字节,移动一个字节,在utf-8下无法正确解码.
f = open('b.txt','r+',encoding='utf-8')
f.seek(1)
print(f.read())
'utf-8' codec can't decode byte 0x93 in position 0: invalid start byte
read(4)读取4个字符
read(4) 读的是字符
print(f.read(2))
- f.truncate
文件截断,是一种写操作,w+
不可以,其他+
可以,因为w+会直接覆盖文件,无法截取
f.truncate(10)
四 : Seek操作拓展
( 1 )seek总是从0位置开始
默认0模式,代表每次从0位置开始
f = open('seek.txt','rb')
f.seek(10)
print(f.tell())
f.seek(3)
print(f.tell())
10
3
( 2) seek 1 模式
代表的是相对位置
使用1时候,文件需要以b
的方式
f = open('seek.txt','rb')
f.seek(10,1)
print(f.tell())
f.seek(3,1)
print(f.tell())
10
13
( 3 )seek 2 模式
相对位置代表从文件末尾开始seek
使用2时候,文件需要以b
的方式
从文件末尾开始前移动 5
个字节,然后再开始正着
读取
f = open('seek.txt','rb')
f.seek(-5,2)
f.read()
应用 : 读取最后一条日志文件
如果正序读出,放入内存则比较浪费,我们可以从后面往前面读取
#循环文件的方式
for i in f:
offs = -10
while True:
f.seek(offs,2)
data = f.readlines()
if len(data) > 1 :
print('文件的最后一行是 : ' + data[-1].decode('utf-8'))
break
offs*=2