Python中文件处理

一、什么是文件?

    文件是计算机中操作系统为用户或者应用程序提供的一个读写硬盘的虚拟单位,文件操作的核心就是读和写。我们需要进行读写操作,就是对操作系统发送请求,然后由操作系统将用户或者应用程序对文件读写操作转换成具体的硬盘指令。

二、为什么要有文件?

    我们知道,内存中的数据是无法永久保存的,能长期保存数据需要用到硬盘。操作文件就可以实现对硬件的操作。

三、python中如何实现对文件的具体操作?

    1.把硬盘中的数据读到内存中

        f = open(r'D:\Python\a.txt', mode = r)#前面的r指定后面字符串的原生路径。mode = r指的打开模式为只读模式

        data = f.read()   #f.read()会一次性将文件全部内容加载到内存中,这里使用一个变量接收文件中的内容

        print(data)

        f.close  #向操作系统发起请求,要求操作系统关闭文件,回收系统资源。

    PS:这里补充一下文件的路径,一般分为两种:绝对路径与相对路径。

    绝对路径:可以理解为从盘符[linux一般从根目录下]开始,写一个完整的路径(如:D:\Python\a.txt   这就是一个文件的绝对路径)

    相对路径:相对于当前目录的目标路径地址(如:当前所处的目录为D:\,\Python\a.txt对于现处的目录就是一个相对路径)

四、python中读写文件的具体模式

    1.控制读写文件的内容的结果有两种,t模式text,b模式byte。这两种模式均不能单独使用,都需要与r/w/a 之一一起连用

    2.默认的内容格式为:t模式

    3.只有文本文件才用t模式,同样也只有t模式才有字符编码的概念。

    4.操作文件的基础模式有三种:

        r 只读模式(默认的), w只写模式,a只追加写模式

    r:read,只读模式

    注意两点:只能读,不能写; 在文件不存在时,会报错,在文件存在时会将文件指针移动到文件起始位置。

    f = (r'a.txt', mode = 'rt' , encoding = 'utf-8')#读取一个相对路径下叫‘a.txt’的文件,以rt方式打开,utf-8字符编码

    data1 = f.read() #一次读取全部文件内容并用data1这个变量去接收

    print(data1)

    f.close()#关闭文件,释放系统资源

     f = (r'a.txt', mode = 'rt' , encoding = 'utf-8')

    print(f.readable())#一次只读取一行文件内容

    print(f.readable(), end='')#读取一行内容,且不换行

    print(f.readable(), end='')

    lines = f.readlines()

    print(lines)

    f.close()

w:只写模式

    注意两点:只能写,不能读; 在文件不存在时自动创建新的空文件,在文件存在时,会在写入的时候将文件清空。 

    f=open(r'b.txt',mode='wt',encoding='utf-8')

    print(f.readable)

    f.write('this\nis\na\ntest\n')#\n换行,this is a test会分4行显示,若文件存在,会在写入的时候将文件清空再写入。

    f.write('abcd\n')#在这次写入的时候会先将文件清空,再写入。

    lines = ['123\n', '456\n', '789\n',]

    for line in lines:

        f.write(line)#循环将lines列表中的元素写入文件中。

    f.writelines(lines)#列表中的元素依次迭代写入文件中。

    f.close()

a: 只追加写模式

    注意两点:只能写,不能读;在文件不存在时候会创建新的空文件并将内容写入,文件存在时会将指针移至文件末尾。

    f=open('c.txt',mode='at',encoding='utf-8')

    print(f.readable)

    f.write('abcd\n')

    f.writelines(['123\n', '456\n', '789\n'])#将列表中的元素迭代写入文件中

 b:二进制模式

注意两点:一定不能指定字符编码,二进制数据没有字符编码这一说,只有t模式下的文本数据才有字符编码;b是二进制模式,是一种通用的文件读取模式,因为所有的文件都是以二进制形式存放在硬盘中的。

    file = open('photo.jpg','rb') #以rb模式打开一个图片

    data = file.read()

    print(type(data), data)

    file.close()

五、循环读取文件中的内容

    我们知道.read()会一次读取全部文件内容,假设某个文件很大,有7G,如果采取这种方式进行读取,7G的数据一下子加载到内存中,会导致机器卡顿(若超过机器内存,有可能会卡死),通过循环读取文件中的内容即可解决。

    f = open('d.txt','rt', encoding = 'utf-8')

    for line in f:

        print(line)

    f.close()

    f = open('d.txt','rb')

        for line in f:

            print(line)

    f.close()

六、上下文管理

    即使一再强调,可能还是会忘记掉关闭打开的文件,释放系统资源。with应运而生。通过with可以在文件打开之后自动释放掉系统资源,由于文件中的数据由变量名接收并保存在内存中,我们使用的时候只需要调用内存中的变量就可以了。

    with open('e.txt','rb')as f , open('j.txt', 'rb')as f1:

        f1.write(f.read())#注意缩进

七、文件操作的其他模式

    r + t(可读、可写)

    w+ t(可写、可读)

    with open('b.txt', 'w+t', encoding = 'utf-8')as f:

          print(f.readable())

          print(f.writeable())

    with open('b.txt',mode = 'rb')as f:

          data = f.read()

          print(data.decode(utf-8))

八、控制文件指针移动

    f.seek(offset, whence)

    offset 代表文件的指针偏移量,单位是字节bytes

    whence表示参照物,有三个取值

    0:参照文件开头

    1:参照当前文件指针所在位置

    2:参照文件末尾

    其中,whence = 1和whence = 2只能在b模式下使用

    f = open('c.txt',mode = 'rt', encoding = 'utf-8')

    f.seek(9, 0)#参照文件开头,指针向又移动9个字节

    print(f.tell())#每次统计的都是从文件开头到当前指针所处的位置

    print(f.readline())

    f.close()

    f = open('c.txt', mode = 'rb')

    f.readline()

    f.seek(6, 1)

    print(f.readline().decode('utf-8'))

    print(f.tell())

    f.close()


    f = open('c.txt', mode = 'rb')

    f.seek(-9, 2)

    print(f.readline().decode('utf-8'))

    print(f.tell())

    f.close

    只有在t模式下read(n), n代表的是字符个数,除此之外涉及到文件指针移动的都是以字节为单位

    f = open('c.txt', mode = 'rt', encoding='utf-8')

    print(f.read(3))

    f.close()

    f = open('c.txt', mode = 'rb')

    print(f.read(3).decode('utf-8'))

    f.close()

    f=open('b.txt',mode='at',)
    f.truncate(9) # 参照物永远是文件开头
    f.close()

九、修改文件

    第一种方法:先将原文件内容一次性全部加载到内存中,然后在内存中修改完毕后,在覆盖写回原文件。

    优点:在修改期间,文件内容只有一份

    缺点:当文件过大,会占用过多的内存空间

with open('d.txt', 'rt', encoding='utf8')as read_f:

    msg = read_f.read()

    msg = msg.replace('123', 'abc')

with open('d.txt', 'rt', encoding='utf-8')as write_f:

    write_f.write(msg)

    以上实现了将原文件中的‘123’替换成‘abc’

    修改文件内容的第二种方法:

    以读的方式打开原文件,以写的方式打开另一个文件,从原文件中循环读取每一行内容修改后写入新文件,删除原文件 ,将新文件重命名为原文件的名字。

    优点:同一时刻只有一行内容存在于内存

    缺点:在修改期间,文件内容始终有两份存在

import os

with open('d.txt', 'rt', encoding='utf-8')as read_f, with open('d.txt.temp', 'wt', encoding = 'utf-8')as write_f:

    for line in read_f:

        write_f.write(line.replace('abc', '123'))

os.remove('d.txt')#删除原文件

os.rename('d.txt.temp', 'd.txt')#将新文件重命名为原文件名




猜你喜欢

转载自blog.csdn.net/zhou_le/article/details/80580834