• python基础学习day8 flie的操作初识


    文件的操作

    • 打开文件 2.对文件句柄进行操作 3.关闭文件。

    open() 有三个参数:1. 文件路径 (文件夹路径+文件名+文件类型) 2. 编码方式(encoding)3. 模式(mode)

    fl = open('d:python.txt',encoding='utf-8',mode='r')   #d:python.txt是我d盘下的一个名为python的TXT文件,我写这个文件时时用sublime软件写的,以utf-8编码格式保存的,所以encoding参数是utf-8。
    content = fl.read()
    print(content)
    fl.close      #每次操作文件后一定要关闭
    >>>i love python
    

    open:内置函数,open底层调用的是操作系统的接口。

    fl:变量,一般在文件操作时设置的约定俗成的变量,也有写作为f1,fh,file_handler,f_h等,也被称为文件句柄(但它只是一个约定俗成的变量,自己可以随意更改,但最好不要改)。通过对文件进行的任何操作都需要用:文件句柄.(fl.raed()等)的方法。

    encoding:可以不写,不写参数会以操作系统默认的编码本打开(windows默认编码:gbk(windows10是utf-8,Linux:utf-8,mac:utf-8),但最好写上,内存中全是Unicode编码,而内存中的文件则不是(详细介绍请看python基础学习day7)

    mode:可以默认不写,默认不写则以只读(r)的方式打开

    常见报错原因

    1. UnicodeDecodeError:文件储存时与文件打开时编码本不一致。

    2. 路径分隔符产生问题: (反斜杠) 有转义符的意思,如 、 、u等,若果文件放在c盘中则有可能报错。如下:

      fl = open('C:Usersa1566Desktoppython.txt',encoding='utf-8',mode='r')
      content = fl.read()
      print(content)
      >>>SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated UXXXXXXXX escape
      
          #解决方法:在文件路径前加r,让转义符失效
      fl = open(r'C:Usersa1566Desktoppython.txt',encoding='utf-8',mode='r')
      content = fl.read()   
      print(content)
      >>>i love python
      
    • 文件的读取:

      • r , rb , r+, r+b.

      • read() 若括号中无参数则一次全部读出,若写参数(数字)则可以按照字符(从1开始)读取,文件中的换行符算作一个字符。

        fl = open(r'd:python.txt',encoding='utf-8',mode='r')
        content = fl.read()
        print(content)
        fl.close()
        >>>i love python
        content = fl.read(5)
        print(content)
        >>>i lov
        
      • readline() 若括号中无参数则读一行,若写参数(数字)则可以按照字符(从1开始)读取字符(同read),文件中的换行符算作一个字符。注意,文本中有换行符,而print()函数也默认换行。

        fl = open(r'd:python.txt',encoding='utf-8',mode='r')
        content = fl.readline()
        print(content)  #可更改print的默认输出结构以取消print函数默认输出的换行符:print(content,end='')
        >>>i love python. 
             #换行符也被读出来了
        
      • readlines() 若括号中无参数读取所有行,返回列表,列表的每个元素为源文件的每一行,若写参数(数字)则可以按照每一行读取。

        fl = open(r'd:python.txt',encoding='utf-8',mode='r')
        content = fl.readlines()
        print(content,end='')
        fl.close()
        >>>['i love python.
        ', 'i love you too.']
        
      • 循环读取,文件句柄可遍历(文件句柄是一个迭代器,每次for循环时都只读取文件一行,节省内存,而read,readlines等是一次读取至内存中,若果文件过大,则会出现问题)。

        f = open(r'd:python.txt',encoding='utf-8')
        for line in f:
            print(line)
        f.close()
        >>>i love python.
        
        i love you too.
        
      • rb:操作的是非文本的文件,比如:图片,视频,音频等。rb模式不用encoding

        fl = open(r'd:雪景.jpg',mode='rb')  #雪景.jpg是张照片
        print(fl.read())
        >>>   #字节太多,请自测
        
      • r+ 读写功能(读并追加),推荐先读后写

        f = open(r'd:python.txt',encoding='utf-8',mode='r+')
        f.read()
        f.write('1234567')  #先读后写
        f.close()
        
        • 文件的读取都有指针(光标)定位,文件中的指针起始位置在文件最前面。r+模式若先读后写,则写入的内容会在文件末尾,若用先写后读,则会从文件开头写入,写入一个字符就覆盖一个字符,直到写入完毕
        • 先写后读会出现乱码问题,因为中文,英文,特殊字符等所占的字节不同,先写后读会以覆盖式写入,若写入得字符串与文件中的字符串所占的字节不同,则会出现乱码和报错。
    • 文件的写:

      • 四种模式:w ,wb, w+, w+b

      • w,wb: 若已有相同的文件则会先清空原有文件的内容再写入 ,若无则会创建。

        • 清空:打开文件后会先清空原文件再写入,但是如果文件句柄没有关闭,则可以循环写入而不会被清空。关闭文件句柄再次以’w‘模式打开原文件时才会清空
        f = open('d:/text.txt',encoding='utf-8',mode='w') #可在当前目录下创建有一个名为text的TXT类型的文件,若已有文件则会先清空文件内容再写入 
        f.write('i love python') 
        f.close()
        
    • 文件的追加:

      • a ,ab ,a+ ,a+b

      • a:若无文件则会创建文件。若有则直接在原文件后追加

        f = open('d:/text.txt',encoding='utf-8',mode='a')  
        f.write('
        i love you too') 
        f.close()
        
    • tell() 读取指针(光标)的位子,以字节为单位(utf-8编码:一个中文三个字节,一个字母1个字节,详情请看day2)

      fl = open(r'd:python.txt',encoding='utf-8')
      print(f1.tell())
      >>>0
      content = fl.read()
      print(fl.tell)
      >>>25
      fl.close()
      
    • seek() 调整光标的位置,以字节为单位 ,调整到文件的开头:seek(0), 调整到文件的末尾:seek(0,2).

      fl = open(r'd:python.txt',encoding='utf-8')
      print(f1.seek(8))
      
    • flush() 强制刷新(保存),一般在写文件时使用,在写后一般要对文件句柄使用flush方法,以免保存失败。

      f = open(r'd:	ext.txt',encoding='utf-8',mode='w')  
      f.write('
      i love you too') 
      f.flush()
      f.close()
      
    • 打开文件的另一种方式(推荐)

      • with open() as :
        • 优点:不用手动关闭文件句柄,会在一定时间内关闭;一个with可以操作多个文件。
        • 缺点:
      with open(r'd:	ext.txt',encoding='utf-8',mode='a') as f:
      	f.write('
      i love you too') 
      
      #打开多个文件:
      with open(r'd:	ext.txt',encoding='utf-8',mode='a') as f1,open(r'd:python.txt',encoding='utf-8',mode='a') as f2:   #第二个open后的反斜杠为换行符,换行符后不加任何字符,当一行的代码太长时可以使用
      	f1.write('
      i love you too') 
          f2.read()
      
    • 文件的修改操作:

      • 各大操作文件的软件(word、笔记本等等)底层都以以下基本方式操作文件:

        • 1.以读的模式打开原文件
        • 2.以写的模式创建一个新文件
        • 3.将原文件的内容读出来修改成新的内容,写入新文件
        • 4.将原文件删除 (python需要引入os模块)
        • 5.将新文件重命名 (python需要引入os模块)
      • 实列方法(将d盘下的python.txt文件中的小写o全变为大写,python文件中的内容如下:i love python./n i love you too. 文件内容简单,请自行创建即可)

        import os   #引入os模块
        #1.以读的模式打开原文件
        #2.以写的模式创建一个新文件
        with open(r'd:python.txt',encoding='utf-8') as f1,
        open(r'd:python.bak',encoding='utf-8',mode='w') as f2:   #.bak是一种备份文件类型
        #3.将原文件的内容读出来修改成新的内容,写入新文件
        	old_content = fl.read()  #读出来的为str类型
            new_content = old_content.replace('o','O')
            f2.write(new_content)
        #4.将原文件删除    
        os.remove('d:python.txt')
        #5.将新文件重命名
        os.rename('d:python.bak','d:python.txt')
        

        以上方法(read)只能用于小文件,遇上大文件就会出现问题,因此可以对其进行更改,如下:

        import os   #引入os模块
        #1.以读的模式打开原文件
        #2.以写的模式创建一个新文件
        with open(r'd:python.txt',encoding='utf-8') as f1,
        open(r'd:python.bak',encoding='utf-8',mode='w') as f2:   #.bak是一种备份文件类型
        #3.将原文件的内容读出来修改成新的内容,写入新文件   
            for old_line in f1:
            new_line = old_line.replace('o','O')
            f2.write(new_line)  
        #4.将原文件删除    
        os.remove('d:python.txt')
        #5.将新文件重命名
        os.rename('d:python.bak','d:python.txt')
        
  • 相关阅读:
    Python 正则表达式(分组)
    django 笔记
    Java代理和动态代理机制分析和应用
    Chrome浏览器如何调试移动端网页信息
    【数据分析】Excle中安装数据分析工具
    【BigData】Java基础_socket编程中使用多线程
    【BigData】Java基础_多线程
    【BigData】Java基础_socket编程
    财务报表之利润表
    资产负债表的会计恒等式
  • 原文地址:https://www.cnblogs.com/wby-110/p/12521052.html
Copyright © 2020-2023  润新知