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())
夜来风雨声,
花落知多少.
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
美美美
哈哈哈哈

是否是可写的

print(f.writable())
True
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')

文件是否关闭

print(f.closed)

显示文件打开的编码

print(f.encoding)

将内存数据刷到硬盘上

光标当前所在位置,返回在第几个字节

注意 read(4)代表读取3个字符,其余的文件内光标移动都是以字节为单位的,如seek,tell,read,truncate

print(f.tell())

读取文件真正的换行符号
python 会将\r\n处理成\n,newline会让其显示真正的样貌,假如是windows平台使用,newline = ''则会显示\r\n

f = open('b.txt','r',encoding='utf-8',newline='')
f.readline()
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(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
上一篇 下一篇

猜你喜欢

热点阅读