欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-26 13:18:23
文件的操作 + 打开文件 2.对文件句柄进行操作 3.关闭文件。 open() 有三个参数:1. 文件路径 (文件夹路径+文件名+文件类型) 2. 编码方式(encoding)3. 模式(mode) open: 内置函数,open底层调用的是操作系统的接口。 fl: 变量,一般在文件操作时设置的约定 ......

文件的操作

  • 打开文件 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. 路径分隔符产生问题: (反斜杠) 有转义符的意思,如\n、\t、\u等,若果文件放在c盘中则有可能报错。如下:

    fl = open('c:\users\a1566\desktop\python.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:\users\a1566\desktop\python.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.\n', '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('\ni 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() 调整光标的位置,以字节为单位

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

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

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