Python基础 - 16 文件

这篇博客详细介绍了Python中文件的打开、关闭、读取和写入操作,包括大文件处理、二进制文件读写以及文件位置的控制。讲解了open()函数的使用,read()、readline()、readlines()的区别,以及write()函数进行文件写入的方法。还提到了使用with语句进行文件操作的优劣,以及os模块的相关文件操作,如切换目录、创建和删除文件夹。
摘要由CSDN通过智能技术生成

一、文件打开

文件(File)
通过Python来对文件内容进行增删改查的操作(I/O Input/Output)
操作文件的步骤

  1. 打开文件
  2. 对文件进行操作(读、写)
  3. 关闭文件

使用open()函数打开文件
open(file, mode=‘r’, buffering=None, encoding=None, errors=None, newline=None, closefd=True)
参数:
file 要打开文件的名字或者路径
返回值:
返回的是一个对象,就是当前被打开的文件对象

      file_name = 'demo.txt'
      file_obj = open(file_name)
      print(file_obj)

      输出结果:
      <_io.TextIOWrapper name='demo.txt' mode='r' encoding='cp936'>

没有报错就表示该文件打开了
如果需要打开的文件与当前的代码在一个文件夹下,则可以直接通过文件的名字来打开
如果需要打开的文件与当前代码不在同一个文件夹下,则需要填写文件的相对路径或者绝对路径来打开

         #需要打开的文件在当前代码的上一级文件
         file_name = ‘../demo.txt’
         
         #需要打开的文件在当前代码的下一级文件
         #file_name = '文件夹名/demo.txt'
         file_name = 'hello/demo.txt'
         
         #需要打开的文件与当前文件不在同一个盘符(或者距离较远)可以使用绝对路径
         file_name =r 'C:\Users\Administrator\Desktop\demo.txt'
         #r是为了告诉解释器这个字符串中没有转义字符(\n,\u...)

使用open()打开文件时,可以将文件分为两种:

  1. 纯文本文件 (使用UTF-8编写的纯文本文件等)
  2. 二进制文件 (不是纯文本文件的都属于二进制文件,包括音频、视频、图片等)

open()这个函数打开文件时,默认打开的是纯文本文件,且编码方式默认为None
由于Python是由美国人开发的,所以它可以默认打开以ASCII编码的文本文件,因此要打开一个汉字的文本文件时,需要指定该文件的编码格式(UTF-8、GBK…)。

           file_name = 'demo.txt'      #文件名字或内容赋值给file_name
           try:
                 with open('demo.txt',encoding = 'utf-8') as file_obj:
                          content = read(file_obj)
                          print(content)
            except FileNotFoundError:
                   print(f'{file_name}没有找到')               

二、关闭文件

close() 关闭文件

        file_name = 'hello/demo.txt'
		file_obj = open(file_name)
		content = file_obj.read()
		print(content)

        file_obj.close()
        file_obj.read()  #报错证明文件已关闭

当我们书写的代码过多时,可能忘记关闭文件
当我们需要修改文件时,需要在close()代码之前添加代码
为了解决这两个问题,Python提供了with…as…语句

		with open(file_name) as file_obj:
		    content = file_obj.read()
		    print(content)
		print(file_obj.read())     

该文件只能在with语句中进行操作,with语句一旦结束,文件自动关闭
当要读取的文件不存在时,我们可以进行异常处理

        file_name = 'abc.txt'
		try:
		    with open(file_name) as file_obj:
		        content = file_obj.read()
		        print(content)
		except:
		    print(f'{file_name}不存在')		

标准的文件读取代码

       try:
		    with open('文件名或路径'') as file_obj:
		        pass
		except FileNotFoundError:
		        pass

三、大文件读取

  1. read()读取文件的内容时,会将文件的内容全部读取到内存中,如果读取的文件非常大可能会导致内存泄漏

  2. read()有一个参数为size,该参数用来指定一次性读取文件的字符长度,默认size =-1,即为全部读取。

  3. 我们可以指定size的大小,这样read()会读取指定长度的字符,每次读取会从上次读取的结束位置开始读取,若剩余的字符长度小于size,会将剩余字符全部读取完成。

  4. 它会将文件的内容全部保存在字符串中返回

       file_name = 'demo.txt'
       with open(file_name)   as file_obj:
            #每次读取6个字符
             content = file_obj.read(6)    #白日依山尽\n
             content = file_obj.read(6)    #黄河入海流\n
             content = file_obj.read(6)    #欲穷千里目\n
             content = file_obj.read(6)    #更上一层楼\n
             print(content)
    

当前代码中有许多重复代码,我们可以通过循环对程序进行优化

        file_name = 'demo.txt'
		#定义一个变量,用来保存读取的内容
		file_content = ''
		#定义一个变量,用来指定每次读取的文件长度
		l = 6
		with open(file_name,encoding='utf-8')   as file_obj:
		    while True:
		       content = file_obj.read(l)
		       file_content += content
		       if not content:
		           #如果没有内容了,就退出循环
		           break
		print(file_content)                

四、其他读取方式

第一种:readline()
readline()默认按照一行一行进行读取,并将读取内容以字符串的形式返回

file_name = 'demo.txt'
with open(file_name,encoding='utf-8') as file_obj:
     print(file_obj.readline())    #读取第一行的内容并返回
     print(file_obj.readline())    #读取第二行的内容并返回

第二种:readlines()
readlines()也是按照一行一行进行读取,它会将读取的内容(文件的全部内容)封装到列表当中

   file_name = 'demo.txt'
   with open(file_name,encoding='utf-8') as file_obj:
     print(file_obj.readline())  

输出结果为:
['《二泉映月》的音符如泉眼汩汩洇漫,我们知道那流浪着的该是一种无奈;\n', '《病中吟》的曲调如汩水缓缓流出,我们知道那流浪着的分明是一种悲凉;\n', '《良宵》的节拍如思念浓浓笼罩,我们知道那流浪着的更是一种彻骨的沧桑。\n', '二胡流浪着一种悲苦和困顿、一种沧桑和无奈。\n', '不是二胡的流浪、音乐的流浪,那样的流浪是一个灵魂的流浪,一方水土的流浪;\n', '那样的流浪是一个时代的流浪,一个民族的流浪。']

五、文件的写入

我们可以利用write()函数来向文件中写入内容
如果要操作的内容是文本文件,则write()函数中的参数只能是字符串类型的

但在写入之前,我们需要先指定文件的操作方式(读、写),原因是以open()函数打开的文件,默认的操作方式是"只读(‘r’)",而在只读模式,是不可以进行写操作的

       file_name = 'demo.txt'
       with open(file_name,'w',encoding='utf-8') as file_obj:
          file_obj.write('有一个精灵,漂泊如三春之水,清冷似冬夜之月')
          file_obj.write('有一个精灵,惆怅如初夏细雨,幽怨似深秋桂子')
          file_obj.write('有一个精灵,它注定了永远都在流浪')

‘w’ 表示可以写,如果打开的文件不存在会创建该文件并向其中写入内容;如果文件存在则会覆盖掉原先文件中的内容

       file_name = 'demo.txt'
       with open(file_name,'a',encoding='utf-8') as file_obj:
          file_obj.write('有一个精灵,漂泊如三春之水,清冷似冬夜之月')
          file_obj.write('有一个精灵,惆怅如初夏细雨,幽怨似深秋桂子')
          file_obj.write('有一个精灵,它注定了永远都在流浪')

'a’表示追加,如果打开的文件不存在会创建该文件并向其中写入内容;如果文件存在则会原先文件中的末尾追加内容

       file_name = 'demo.txt'
       with open(file_name,'r+',encoding='utf-8') as file_obj:
          file_obj.write('有一个精灵,漂泊如三春之水,清冷似冬夜之月')
          file_obj.write('有一个精灵,惆怅如初夏细雨,幽怨似深秋桂子')
          file_obj.write('有一个精灵,它注定了永远都在流浪')

'+'表示功能的增加
'r+'方式下,文件既可以读也可以写,但是只能向已存在的文件(file_name = ‘demo4.txt则会报错’)中写入内容,且会覆盖原先文件中的内容

       file_name = 'demo4.txt'
       with open(file_name,'x',encoding='utf-8') as file_obj:
          file_obj.write('有一个精灵,漂泊如三春之水,清冷似冬夜之月')
          file_obj.write('有一个精灵,惆怅如初夏细雨,幽怨似深秋桂子')
          file_obj.write('有一个精灵,它注定了永远都在流浪')   

'x’用来创建文件,如果打开的文件不存在会创建该文件并向其中写入内容;如果文件存在则会报错(file_name = 'demo.txt’报错,file_name = 'demo4.txt,会在当前文件下创建一个demo4.txt)

六、二进制文件读写

读取文本文件所用的文件模式为mode = ‘rt’(t表示文本文件)
读取二进制文件所用的文件模式为mode = ‘rb’ (b表示二进制文件)
读取二进制文件时,建议分段读取

file_name = r'C:\Users\Administrator\Desktop\Kalimba.mp3'
with open(file_name,'rb') as file_obj:
    #文本文件中,size表示字符大小(字符标识一个英文单词或一个汉字或一个符号)
    #二进制文件中,size表示字节大小(字节则是计算机内存的最小单位,8bit = 1Byte)
    
    content = file_obj.read(100)
    print(content)

将读取到的内容写入文件中

file_name = r'C:\Users\Administrator\Desktop\Kalimba.mp3'
with open(file_name,'rb') as file_obj:

    #定义一个文件名,用来保存读取的二进制文件
    new_file = r'C:\Users\Administrator\Desktop\test1.mp3'
    with open(new_file,'wb') as file_content:
        c = 1024 * 100
        while True:
            content = file_obj.read(c)
            file_content.write(content)
            #读取完毕,循环终止
            if not content:
                break	    

七、读取文件的位置

seek()函数 将文件从指定位置开始读取(将当前文件按照指定位置进行剪切,形成新的文件对象)
参数:
0 默认从头开始剪切文件
2 从末尾计算剪切的文件字节长度

seek(-10,2)     从末尾开始计算,读取10个字节

	    file_name = 'demo3.txt'
	    with open(file_name,'rb') as file_obj:
	    
	    #将文件从末尾开始剪切,剪切10个字节,形成新的文件对象
	    file_obj.seek(-10, 2)
	    
	    #从第三个字节开始读取,直到文件结束
	   # file_obj.seek(3)
	    
	    #读取新的文件对象中的内容
	    content = file_obj.read()
	    print(content)
	    
	    #tell() 获得当前文件读取的位置
	    print('当前读到了-->',file_obj.tell())
	    print(len(content))

当读取中文文件时,需要注意字节长度的转换
①ASCII码中:一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。
②UTF-8编码中:一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。
③Unicode编码中:一个英文字符等于两个字节,一个中文(含繁体)等于两个字节。
④UTF-16编码中:一个英文字母字符或一个汉字字符存储都需要2个字节(Unicode扩展区的一些汉字存储需要4个字节)
⑤UTF-32编码中:世界上任何字符的存储都需要4个字节。

        file_name = 'demo2.txt'
		with open(file_name,'rt',encoding='utf-8') as file_obj:
		
		    #从第三个字符开始读取,直到读取完成
		    file_obj.seek(6)
		    
		    #读取新的文件对象中的容
		    content = file_obj.read()
		    print(content)
		    
		    #tell() 获得当前文件读取的位置
		    print('当前读到了-->',file_obj.tell())
		    print(len(content))

八、文件的其他操作

os模块

  1. os.listdir(path) 获取指定路径下的文件夹目录

  2. os.getcwd() 获取当前文件所在的目录

  3. os.chdir(path) 切换到指定目录下

  4. os.mkdir(path) 在指定路径下创建文件夹,只传一个文件名则默认在当前路径下创建

  5. os.rmdir(path) 删除指定路径下的指定文件夹,该文件必须为空。只传一个文件名则默认删除在当前路径下的指定文件夹

  6. os.rename(src,dst) 第一个参数为需要修改的文件名或目录,第二个参数为修改后的文件名或目录,只能修改当前路径下的文件

  7. os.remove(path) 删除指定路径下的文件

        import os
     	r = os.listdir('.')   #默认为'.',即返回当前路径下文件夹目录
     	r = os.listdir('..')  #返回当前路径的上一级路径下的文件夹目录
     	r = os.getcwd()       #获取当前文件的目录
     	os.chdir('c:/')       #切换当前目录到c盘
     	r = os.getcwd()
     	
     	#在指定目录下创建一个空文件夹,文件夹存在则报错
     	os.mkdir(r'C:\Users\Administrator\Desktop\abc')   
     	
     	#删除指定的文件夹
     	os.rmdir(r'C:\Users\Administrator\Desktop\abc')    
     	 
     	#删除指定的文件
     	os.remove(r'C:\Users\Administrator\Desktop\demo2.txt')  
     	
     	#重命名当前目录下的指定文件
     	os.rename('demo3.txt','demo5.txt')  
     	print(r)
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值