python之旅基础——文件处理


一、概述

  1、对于计算机来说,想要永久保存一个数据,就需要以文件的形式存储在硬盘。存储在硬盘上的数据都是以二进制形式存放,所以,在写入和读取的时候需要注意编码。

  2、二进制数据解码成字符串(decode),字符串编码成二进制数据(encode)。

  3、文件处理的流程:

    ①打开文件,得到文件句柄,并赋值给一个变量(从硬盘中加载文件内容到内存);

    ②通过句柄对文件进行操作;

    ③关闭文件。

  4、文件修改的流程:(计算机无法直接修改原文件中的内容)

    ①打开源文件,读取文件中的数据;

    ②以写模式打开一个新的文件,将修改好的文件内容写入这个新文件中;

    ③将新文件名修改成源文件名,在硬盘上覆盖源文件。

  5、在Python中,打开文件可以是以b的模式打开,如rb以二进制读的模式打开文件;wb以二进制写的模式打开文件。注意的是:以二进制打开文件时,无需考虑encoding参数。

    有这样模式的意义在于:①文件包含视频文件或图片文件,它们都是以二进制的方式存放在硬盘上的,读取的时候也不会有编码,所以要以二进制的模式打开

              ②二进制文件跨平台效果好

  6、打开文件使用open(filename, mode="rt", encoding=None)内置函数。

    默认以“rt”模式打开文件(只读,txt文件)。编码encoding默认跟随操作系统的编码。

二、文件的读操作

f = open("日志文件", "r", encoding="utf-8")     #按只读的模式打开文件

date = f.read()             #由光标处开始,读取剩下的全部内容

date = f.read(n)            #由光标处开始,读取接下来的n个字符内容

date1 = f.readline()        #由光标处开始,读取一行的内容(即遇到\n停止)

date2 = f.readlines()       #由光标出开始,按行读取剩下的全部内容,并将每行的内容作为一个元素放入列表中

f.readable()                #判断文件内容是否可读

  注:关于文件的操作,只有read()是以字符为单位进行操作,后面所讲的所有对文件的操作,都是以字节为单位进行操作。

f = open("日志文件", "rb")          #按二进制只读模式打开文件
date = f.read()                       #由光标处开始,读取剩下的全部内容,此时读取到的数据都是二进制字节
print(date.decode("utf-8"))         #想要打印date数据,且有可阅读性,需要将二进制字节解码成字符串

三、文件的写操作

f = open("new_file", "w", encoding="utf-8")         #按只写的模式打开文件,如果文件名不存在,则创建文件;如果文件名存在,操作文件时,文件内容将会被覆盖

f.write("我爱党和祖国")                               #以字符串的形式,写入文件
 
f.writelines("1\n2\n3")
f.writelines(["123", "456"])                           #writelines(iterable),以可迭代对象的形式写入文件

f.writable()                                            #判断文件是否可写

f.close()                                               #关闭并保存文件
f = open("new_test", "wb")              #按二进制写的模式打开文件

f.write("i love u".encode("utf-8"))     #写入文件内容必须是二进制字节类型,所以需要将写入的字符串编码成二进制

f.close()

四、文件的追加操作

f = open("new_test2", "a", encoding="utf-8")        #按追加的模式打开文件,如果文件名不存在,则创建文件;如果文件名存在,操作文件时,文件内容将会追加在文件末尾
f.write("我爱你")
f.close()

五、+模式操作

  r+:表示文件已读写的模式打开

  如a模式不同是,向文件内容添加信息的时候,r+模式是在光标处添加覆盖内容。

六、光标操作

  文件内容的读取和写入,都是从根据光标所在的位置进行操作的。

  1、f.tell()

    返回目前光标所在的位置。

  2、f.seek(n, mode=0)

    移动光标。n是指光标所移动的字节数。

    mode是指移动光标的模式:①0:默认光标初始位置在文件开始

                 ②1:表示光标在上一次光标停留的位置

                 ③2:表示光标初始位置在文件末尾

f = open("日志文件", "r", encoding="utf-8")

f.seek(10)              #默认从文件开头,向后移动光标10个字节
print(f.tell())         #此时返回10

f.seek(11)              #默认从文件开头,向后移动光标11个字节
print(f.tell())         #此时返回11

f.seek(3,1)             #从上一次光标停留的地方开始,向后移动光标3个字节
print(f.tell())         #此时返回14

f.seek(-10,2)           #从文件末尾,向前移动光标10个字节。注意:n为负数

从文件末尾向后移动光标,最终读取文件最后几行内容。可以用于读取最后几行日志文件。

f = open("日志文件", "rb")          #读取日志文件

offs = -10                            #预估seek的偏移数

while True:
    f.seek(offs, 2)                   #从文件末尾,移动光标offs个字节
    date = f.readlines()              #按行读取剩下的所有内容
    if len(date) > 1:
        print(date[-1].decode("utf-8"))     #如果行数大于1,可以截取最后一行的内容返回
        break
    else:
        offs *= 2                     #如果行数<=1,那么表明可能没有获取完全最后一行的内容

七、其他

  1、f.flush()

    在没有f.close()的状态下,运行f.flush(),将内存中的数据保存到硬盘文件中。

  2、f.truncate(n)

    以r+/a+模式打开文件,截取前n个字节的内容读取。(由于w模式是覆盖,所以一旦使用w模式打开,truncate()后得到结果是空)

优质内容筛选与推荐>>
1、C#_Wpf_DataContex上下文整个类绑定
2、tomcat的目录结构(转)
3、Unity踩过的坑
4、css3圆角和阴影效果
5、2008,我们不屈不挠!中国,加油!


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn