当前位置: 移动技术网 > IT编程>脚本编程>Python > python基础学习day8 flie的操作初识

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

2020年03月19日  | 移动技术网IT编程  | 我要评论

韦小宝古今奇缘,晚秋黄梨栽培技术,怪兽之谜5

文件的操作

  • 打开文件 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')

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网