zoukankan      html  css  js  c++  java
  • 文件操作

    文件操作

    什么是文件?

    所谓“文件”,就是在我们的电脑中,以实现某种功能、或某个软件的部分功能为目的而定义的一个单位。

    为什么要有文件

    内存无法永久保存数据,但凡我们想要永久保存数据都需要把文件保存到硬盘中,而操作文件就可以实现对硬件的操作。

    文件的打开过程

    • step1 点击需要打开的文件
    • step2 操作系统接收到命令,将文件路径传送给CPU
    • step3 CPU根据路径去硬盘中寻找文件,然后调取到内存中
    • step4 操作系统将调取的文件显示出来,可进行读写保存等操作

    python如何操作文件

    现在我有一段字符串需要存储到文件中,该如何通过编程进行实现呢?

    str1 = 'Bonnie is a beautiful girl'
    

    从硬盘中读取数据

    在python中有一个open(file,mode,encoding )函数打开某个具体的文件

    • file 代表文件路径
    • mode 表示文件操作模式,默认为只读不写
    • encoding 表示文件解码方式
    open(r'D:Python编程文件编程Myself测试文件')
    

    如果给列表增加值,我们需要给列表赋值后才能给对应的列表增加值,文件同样是如此

    lis = [1,2,3]
    lis.append(4)
    
    # 打开文件
    
    f = open(r'E:学习资料Python编程文件编程Myself38a.txt')
    print(frzaf)
    
    <_io.TextIOWrapper name='E:\学习资料\Python编程文件\编程Myself\38a.txt' mode='r' encoding='cp936'>
    

    文件的打开方式

    打开文件后,文件不仅占用了内存,还对应了操作系统打开的文件,相当于使用文件编辑器打开了一个文件。之前说过,操控文件的目的就是存和取,因此打开文件不是目的,读和写才是目的,所以我们要尝试如何读写文件。

    读入模式( read模式)

    f = open(r'D:Python编程文件编程Myself测试文件',mode='r',encoding='utf-8')
    print(f.read())
    f.close()
    
    Bonnie is a beautiful girl
    

    写入模式( write模式)

    fw = open(r'D:Python编程文件编程Myself测试文件',mode='w',encoding='utf-8')
    fw.write('hades is handsome')
    fw.flush()
    fw.close()      # 将"Bonnie is a beautiful girl"替换成了hades is handsome
    '''
    最终打印结果:
    hades is handsome
    '''
    

    绝对路径和相对路径

    • 绝对路径就是从根目录开始,如open(r'D:Python编程文件编程Myself测试文件')
    • 相对路径就是文件都处在同一个文件夹中,如open(r'测试文件')

    with管理文件操作上下文

    • 实现文件的打开
    with open(r'D:Python编程文件编程Myself测试文件', 'r', encoding='utf8') as fr:
        data = fr.read()
        print(data)
    
    hades is handsome
    Bonnie is a beautiful girl
    
    • 实现文件write
    with open(r'D:Python编程文件编程Myself测试文件', 'w', encoding='utf8') as f:
       f.write('hades is handsome')
    with open(r'D:Python编程文件编程Myself测试文件', 'r', encoding='utf8') as fr:
        data = fr.read()
        print(data)
    
    hades is handsome
    
    with open(r'D:Python编程文件编程Myself测试文件', 'a', encoding='utf8') as f:
       f.write('
    Bonnie is a beautiful girl')
    with open(r'D:Python编程文件编程Myself测试文件', 'r', encoding='utf8') as fr:
        data = fr.read()
        print(data)
    
    hades is handsome
    Bonnie is a beautiful girl
    
    • 实现文件的拷贝
    with open('test', 'r', encoding='utf8') as fr, 
            open('test1', 'w', encoding='utf8') as fw:
        data = fr.read()
        fw.write(data)
    

    绝对路径和相对路径

    绝对路径

    在windows系统中,绝对路径是从盘符开始的,如C:\,D:

    • D:Python编程文件编程Myself测试文件

    相对路径

    相对路径就是相对于当前文件所在的路径,就是从本层文件中找

    f = open('测试文件')    # 这就是相对路径
    

    文件的三种打开方式

    文件打开之r模式

    r:表示read,只读模式,只能读不能写,当文件不存在时会报错

    f = open(r'E:学习资料Python编程文件编程Myself38a.txt',mode='r',encoding='utf-8')
    print(f.read())
    f.close()
    
    bonnie is a beautiful girl
    
    # rt:表示用text读取文本文件
    
    # 我们的操作系统默认编码为gbk,因此需要使用utf-8编码
    
    f = open(r'E:学习资料Python编程文件编程Myself38a.txt',mode='rt',encoding='utf-8')
    data = f.read()
    print(data)
    print(type(data))
    f.close()
    
    bonnie is a 漂亮的  girl
    <class 'str'>
    
    # rb:表示用二进制读取文本文件
    
    # b模式是通用的模式,因为所有的文件在硬盘中都是以二进制的形式存储的,需要注意的是:b模式读写文件,
    # 一定不能加上encoding参数,因为二进制无法再编码。
    
    
    f = open(r'E:学习资料Python编程文件编程Myself38a.txt',mode='rb')
    data = f.read()
    print(data)
    print(type(data))
    f.close()
    
    b'bonnie is a xe6xbcx82xe4xbaxaexe7x9ax84  girl'
    <class 'bytes'>
    

    f.read()读取文件时指针会跑到文件的最后面,如果再次读取,将会是空格

    f = open(r'E:学习资料Python编程文件编程Myself38a.txt',mode='r',encoding='utf-8')
    data1 = f.read()
    print(1,data1)
    data2 = f.read()
    print(2,data2)
    f.close()
    
    1 bonnie is a 漂亮的  girl
    2 
    

    如果文件过大,read一次性读取文件所有内容,很容易造成电脑卡死,因此我们可以使用f.readline()/f.readlines()读取文件

    文件打开之w模式

    w:表示write,只能写不能读,需要先清空文件再写入内容;当文件不存在时,会先创建文件后再写入

    fw = open(r'E:学习资料Python编程文件编程Myself38a.txt',mode='w',encoding='utf-8')
    fw.write('hades is handsome')
    fw.flush()
    fw.close()      # 将"Bonnie is a beautiful girl"替换成了hades is handsome
    '''
    最终打印结果:
    hades is handsome
    '''
    

    文件打开之a模式

    w:表示追加,文件存在,则在文件的末端写入内容;文件不存在的时候会创建文件后写入内容。

    fa = open(r'E:学习资料Python编程文件编程Myself38a.txt',mode='a',encoding='utf-8')
    fa.write('hades is handsome')
    fa.write('
    Bonnie is a beautiful girl')
    fa.flush()
    fa.close()     
    '''
    最终打印结果:
    hades is handsome
    Bonnie is a beautiful girl
    '''
    

    with管理文件操作上下文

    之前我们使用open打开文件的时候,我们还需要进行手动释放文件对内存的 占用,所以很不方便,其实还有更好的方法打开文件,就是python中的上下文管理工具----with open().

    with open(r'E:学习资料Python编程文件编程Myself38a.txt',mode='r',encoding='utf-8') as fr:
        print(fr.read())
    
    hades is handsomehades is handsome
    Bonnie is a beautiful girl
    

    with open()不仅提供自动释放内存的方法,还可以一次打开多个文件,中间使用逗号隔开,实现文件的快速拷贝。

    文件的高级应用

    可读/可写

    • r+t:可读、可写
    • w+t:可写、可读
    • a+t:可追加、可读
    with open('36w.txt', 'wt', encoding='utf-8') as fw:
        print(fw.readable())
        print(fw.writable())
    
    False
    True
    
    with open('36w.txt', 'w+t', encoding='utf-8') as fw:
        print(fw.readable())
        print(fw.writable())
    
    True
    True
    
    with open('36w.txt', 'r+t', encoding='utf-8') as fr:
        print(fr.readable())
        print(fr.writable())
    
    True
    True
    

    文件内的指针移动

    当文件内容中间需要增加内容时,单纯的使用w和a模式已无法实现,所以我们需要对文件内的指针进行移动

    • 指针就是我们眼中的光标

    硬盘上从来没有修改一说,硬盘上只有覆盖,即新内容覆盖新内容。

    seek(offset,whence)

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

    • whence代表光标的位置,0表示文件的开头,1代表当前光标位置,2表示文件末尾

    with open(r'E:学习资料Python编程文件编程Myself38a.txt',mode='rt',encoding='utf-8') as fr:
        data = fr.seek(8,0)
        print(data)
    
    8
    

    tell()

    每次统计都是从文件的开头到当前指针所在的位置

    with open(r'E:学习资料Python编程文件编程Myself38a.txt',mode='rt',encoding='utf-8') as fr:
        data = fr.seek(3,0)
        print(fr.tell())
    
    3
    

    read(n)

    只有在模式下的read(n),n代表的是字符个数,除此之外,其他但凡涉及文件指针的都是字节个数

    with open(r'E:学习资料Python编程文件编程Myself38a.txt',mode='rt',encoding='utf-8') as fr:
        fr.seek(4,0)     # 指针现在正在第四个字节处
        data = fr.read(3) # 从第4个字节向后读3个字符
        print(data)
    
    s i
    

    truncate(n)

    truncate(n)是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate()要在r+或a或a+等模式下测试效果。它的参照物永远是文件头。并且truncate()不加参数,相当于清空文件。

    with open(r'E:学习资料Python编程文件编程Myself38a.txt',mode='rt+',encoding='utf-8') as fr:
        fr.truncate(3)     
        print(fr.read())
    
    had
  • 相关阅读:
    ios可变数组的所有操作
    iOS不可变数组的所有操作
    Android 混淆打包
    Android 给TextView中的字体加上“中间线”
    Android 在ScrollView中嵌入ViewPage后ViewPage不能很好的工作的问题解决
    Android Bundle传递对象
    Java java.text.ParseException: Unparseable date
    Android关于LinearLayout和RelativeLayout背景设置的区别
    Android 给CheckBox设置背景
    Android String.xml中的符号总结
  • 原文地址:https://www.cnblogs.com/Hades123/p/10845512.html
Copyright © 2011-2022 走看看