打赏

Python基础(14)——文件处理

文件操作的步骤:

1、文件打开,得到文件句柄并赋值给一个变量   f = open('文件路径',encoding='utf-8')  其中python自己用的是utf-8编码,如果不给出edcoding的参数,那么open函数会自动检测操作系统的默认编码,windows下编码是GBK格式,MAC系统编码是utf-8

  文件存在硬盘中是二进制的,要用编码来解码,而要操作的话必须加载到内存中,open程序是向操作系统要了个文件的句柄,f 就是文件句柄,加载到内存

2、通过文件句柄对文件进行操作

  data = file.read()

3、关闭文件

  file.close()

 

文件操作的几种模式:

r 只读不能写模式    w 只能写不能读,如果已有文件内容则清空,文件不存在则新建一个            a 追加内容到文件的末尾

r+

文件没有修改,都是覆盖,注意write随光标覆盖    

file.read() 全部读取    光标直接移动到最后了,如果文件比较大,非常占内存

file.readline()只读一行,读过后读下一行,一行一行读取

file.readlines() 全部读取,形成每一行组成的一个列表

file.write()  可写,换行用\n      

file.writelines()  可写入列表

文件的内容只能是字符串,无论是read  还是write 输入和输出的都是字符串,其他数据类型会报错

修改文件的内容,可以先打开文件读取,然后修改具体的内容,重新写这个文件完成修改。

with open('file','w') as file:   这种形式可以省略掉file.close()。防止忘记关闭影响操作

f = open('list','rb',encoding='utf-8') #这错误的,既然是字节形式,那么就不能指定编码了,读出来的就是二进制WINDOWS中换行是\r\n   linux种是\n换行
b'中文'这个形式不是转换函数,只是一种显示方式

为什么使用二进制来处理文件?1、原操作的读写默认的都是读写txt文件,但是音频视频等等文件也需要读取的时候就需要通过二进制来处理了,2、另外二进制可以夸平台,这样避免了兼容性。3、b模式在linux中没用,本身默认就是b模式,而在windows中有用

f.closed 是不是关闭的?
f.encoding 文件打开时的编码,不是文件保存的编码,不能混淆
encoding = 'latin-1'拉丁文解码方式能尽可能保留字符串,没什么用
f.flush 刷新到文件里保存
f.name 文件名
f.tell()光标位置 这里要注意在windows环境下如果有换行回车的话那么结尾会有两个字节\r\n ,utf-8汉子是3个字节,所以你好是6字节,如果换行了那么tell光标的结果就是到8, 前面是0-7 ,所有光标操作都是字节操作
python默认做了一件事,就是在newline这个参数中把\r默认去掉了,所以windows中总是多出一个字节\r是因为被默认隐藏了# f = open('list','r',encoding='utf-8',newline='')这样\r就显示出来了
f.seek(0) 光标移动到第几个字节 ,而read(4) 读取的是字符,按几个字符来读取,所以seek如果整好读到汉子的中间字节那么会报错,而read按字符读取则不会报错
f.seek(10,1) 默认模式是0,1模式是相对位置,这个时候需要用rb二进制打开,否则报错;2模式的话是倒序,f.seek(-10,2),应用场景是log文件分析后面的内容,最底下的内容所有用倒序比较方便,如果把一个大文件的内容都放到内存中处理,再找到最后一行的话非常占内存,这样就节省资源 大文件的循环方式for i in f:是一行一行给,见例子,找出文件最末未一行
f = open('list','rb')

for i in f:
    offs = -10
    while True:
        f.seek(offs,2)
        data = f.readlines()
        if len(data)>1:
            print('文件最后一行是%s'%(data[-1].decode('utf-8')))
            break
        offs*=2

 

f.truncate(10)截取切片的操作,truncate也是字节操作和tell、seek一样


 

posted on 2019-06-19 21:59  大有哥  阅读(285)  评论(0)    收藏  举报

导航