首页 > 其他分享 >文件操作

文件操作

时间:2023-12-11 17:25:13浏览次数:31  
标签:fp 文件 encoding 模式 print 操作 open

文件操作

一、什么是文件

  • 文件就是应用程序等在运行过程中,产生的数据在操作系统中的虚拟概念
  • 我们需要将这些数据文件保存到硬盘中,要通过操作系统完成对系统内存和硬盘的操作

二、文件操作的进本流程

  • 我们在使用open()操作时要依次填入(‘文件名’,'读写方式','编码格式')
# 1. 打开文件,由应用程序向操作系统发起系统调用open(...),操作系统打开该文件,对应一块硬盘空间,并返回一个文件对象赋值给一个变量f
f = open('01', 'r', encoding='utf-8')

# 2. 调用文件对象下的读/写方法,会被操作系统转换为读/写硬盘的操作
data = f.read()

# 3. 向操作系统发起关闭文件的请求,回收系统资源
f.close()

三、文件操作中的资源回收

  • 打开一个文件是我们需要占用两份资源一个是f变量和我们打开的那个文件的资源

  • 为了节省资源我们需要把这两个全部回收了

    f.close() # 回收操作系统打开的文件资源
    del f # 回收应用的程序级变量
    
  • 其中del f一定要发生在f.close()之后

    • 否则就会导致操作系统打开的文件无法关闭,白白占用资源
  • python为我们提供了自动的垃圾回收机制我们就不需要考虑del f这一步了

  • 而且f.close()我们也可以通过with关键字来帮我们管理。

# 1、在执行完子代码块后,with 会自动执行f.close()
with open('a.txt','w') as f:
	pass 

# 2、可用用with同时打开多个文件,用逗号分隔开即可
with open('a.txt','r') as read_f,open('b.txt','w') as write_f:  
	data = read_f.read()
	write_f.write(data)

四、文件的操作模式

[1]有哪几种模式?

  1. (r)只读模式
  2. (w)只写模式
  3. (a)只追加写模式

[2]只读模式(a)

  • r只读模式: 在文件不存在时则报错,文件存在文件内指针直接跳到文件开头
 with open('a.txt',mode='r',encoding='utf-8') as f:
     	res=f.read() # 会将文件的内容由硬盘全部读入内存,赋值给res
  • 当路径中可能存在有转义的字符时,字符串前面加上r来解决转义的问题
r'D:\a.txt'

[3]只写模式(w)

  • w只写模式: 在文件不存在时会创建空文档,文件存在会清空文件,文件指针跑到文件开头
with open('b.txt',mode='w',encoding='utf-8') as f:
    f.write('你好\n')
    f.write('我好\n') 
    f.write('大家好\n')
    f.write('my name is Xanadu')
  • 强调
    • 在文件不关闭的情况下,连续的写入,后写的内容一定跟在前写内容的后面
    • 如果重新以w模式打开文件,则会清空文件内容

[4]只追加写模式(a)

  • a只追加写模式: 在文件不存在时会创建空文档,文件存在会将文件指针直接移动到文件末尾
with open('02', 'a', encoding='utf-8') as f:
    f.write("my age is 20")
  • 强调 w 模式与 a 模式的异同
    • 相同点:在打开的文件不关闭的情况下,连续的写入,新写的内容总会跟在前写的内容之后
    • 不同点:以 a 模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后

五、控制文件读写内容的模式

  • 文件读写的内容一般分为二进制的内容和文本的内容

[1](默认模式)文本模式(t)

  • 读写文件都是字符串类型
  • 只针对文本文件
  • 需要规定转码表(encoding)参数
    • 手动创建一个文本文件,输入几个字母

# t 模式 可以读出文本中的内容

with open('01', 'rt', encoding='utf8') as fp:
    print(fp.read())  # Xanadu bridge water farm
    print(type(fp.read()))  # <class 'str'>

# t模式下 写入只能写入字符串    
with open('01', 'at', encoding='utf8') as fp:
    fp.write(" road")    

  • 强调:t 模式只能用于操作文本文件,无论读写,都应该以字符串为单位,而存取硬盘本质都是二进制的形式,当指定 t 模式时,内部帮我们做了编码与解码

[2]二进制模式(b)

  • 读写文件都是以bytes/二进制为单位的
  • 可针对所以文件
  • 不能指定encoding参数
# b模式下所以读写内容都是二进制
with open('01', 'rb') as fp:
    data = fp.read()
    # b'Xanadu bridge water farm road' 读到的结果看起像字符串,这是因为默认的字符编码utf8中英文单词就是这样
    print(data)
       
with open('01', 'ab') as fp:
    fp.write(b'wind')    

  • 强调:b模式对比t模式
    • 在操作纯文本文件方面t模式帮我们省去了编码与解码的环节,b模式则需要手动编码与解码,所以此时t模式更为方便
    • 针对非文本文件(如图片、视频、音频等)只能使用b模式

[强调]

  • tb模式均不能单独使用,必须与r/w/a之一结合使用

六、文操作方法(细分)

[1]读操作

  • read()
# read方法是将整个文件全部读完,结束后光标会移动到文件末尾
with open('02', 'r', encoding='utf8') as fp:
    print(fp.read())
'''
    my name is Xanadu
    my age is 20
    my numbering is 666
'''
  • readline()
#readline 就像字面意思,读一行内容,然后光标移到第二行首部
with open('02', 'r', encoding='utf8') as fp:
    print(fp.readline())
    print(fp.readline())
'''
my name is Xanadu

my age is 20
'''
#如果连续多行readline(),之间会有换行符隔开
  • readlines()
#读取每一行的内容,然后放入列表
with open('02', 'r', encoding='utf8') as fp:
    print(fp.readlines())
'''
['my name is Xanadu\n', 'my age is 20\n', 'my numbering is 666']
'''

[2]写操作

  • write()
# write 能写入单行的字符串,换行需要自己输入换行符
with open('02', 'a', encoding='utf8') as fp:
    fp.write('\nmy height is 177.5')
  • writelines()
# write 可以写入多个字符串
with open('02', 'a', encoding='utf8') as fp:
    fp.writelines(['\nmy height is 177.5', '\nmy hobby is music'])

[3]判断文件是否可读可写可关闭

  • .readable() 文件是否可读
  • .writable() 文件是否可写
  • .closed() 文件是否关闭
  • encoding 如果文件打开模式为b,则没有该属性
  • .flush 立刻将文件内容从内存刷到硬盘
  • .name 获取文件的名字
with open('01', 'r', encoding='utf8') as fp:
    print(fp.readable())  # True    返回True可读
    print(fp.writable())  # False   返回False不可写
    print(fp.closed)  # False   返回False程序正在运行中,没有关闭
    print(fp.encoding)  # utf8  返回编码表

    fp.flush()
print(fp.closed)  # True    #程序结束后自然就会关闭返回 True

七、主动控制文件内指针的移动

[1]f.seek()方法的介绍

  • 注意:文件内指针的移动都是Bytes为单位的,唯一例外的是t模式下的read(n),n以字符为单位

  • 我们使用f.seek()方法来控制文件内指针的移动

    • 格式f.seek(指针移动的字节数,模式控制)
  • 模式我们分三种:0模式,1模式,2模式

[2]0模式

  • 0模式是默认的模式,该模式代表指针移动的字节数是以文件开头为参照的
with open('03', 'rt', encoding='utf8') as fp:
    fp.seek(3, 0)
    print(fp.tell()) #.tell()函数可以当前指针距离文件头的位置
    print(fp.read())

'''
3
DEFGHIJKLMN
'''

[3]1模式

  • 该模式代表指针移动的字节数是以当前所在的位置为参照的

with open('03', 'rb') as fp:
    fp.seek(3, 1)
    print(fp.tell())
    fp.seek(3, 1)
    print(fp.tell())
    print(fp.read())
'''
3
6
b'GHIJKLMN'
'''

[4]2模式

  • 2: 该模式代表指针移动的字节数是以文件末尾的位置为参照的
with open('03', 'rb') as fp:
    fp.seek(0,2)
    print(fp.tell())
    fp.seek(-5,2)
    print(fp.tell())
    print(fp.read())
'''
14
9
b'JKLMN'
'''

标签:fp,文件,encoding,模式,print,操作,open
From: https://www.cnblogs.com/taoyuanshi/p/17880349.html

相关文章

  • svn不上传.net的bin、obj等文件路径
    1、打开svn的setting2、找到通用中的Subversion3、修改以上红框中文本*.o*.lo*.la*.al.libs*.so*.so.[0-9]**.a*.pyc*.pyo__pycache__*.rej*~#*#.#*.*.swp.DS_Store[Tt]humbs.dbbinobj4、修改文本文件5、新增binobj的文件路径 6、点击应用、确......
  • 瑞萨RZ/G2L核心板Linux Log目录文件详解
    为了排除系统问题,监控系统健康状况以及了解系统与应用程序的交互方式,我们需要了解各log文件的作用,以G2L中yocto文件系统为例,在系统/var/log/目录下会存放记录系统中各个部分的log文件作用如下:1. 文件详情下图为系统中 /var/log目录下的文件。图1.1目录下的文件Log文件作用......
  • 安卓读写文件的方法以及优劣分析
    文章摘要在Android开发中,数据的存储和读取是应用程序中常见的操作之一。本文将详细介绍Android中读写文件的方法,并对其优劣进行分析。同时,将附上相应的实现代码,以便读者更好地理解。正文使用Java的IO流在Android中,我们可以使用Java的文件IO类来读取和写入本地文件系统......
  • C++学习笔记六:运算符(五种基本运算操作,优先级和结合性)
    这一章对操作符进行简单的总结:1.五种基本运算类型:加减乘除,取余add,substract,multiply,divide,modulusintnumber1{2};intnumber2{7};intresult=number1+number2;result=number2-number1;result=number1-number2;result=number1*number2;result=......
  • 在Arduino环境下对ESP32进行寄存器操作和区别比较
    在Arduino环境下对ESP32进行寄存器操作和区别比较前言这篇文章主要是对在Arduino环境下如何对ESP32进行寄存器操作进行了相关的说明。并且比较了在不同编程方式下GPIO口的电平翻转速度,这可以更加直观的不同编程方式下的代码运行效率。(平台是VScode,使用Platformio下的Arduino固......
  • 对virsh dumpxml 文件的解释
    <name>Centos</name><uuid>dc502a07-6a66-0472-45b2-0afc2b7a8237</uuid><memoryunit='KiB'>16580608</memory><currentMemoryunit='KiB'>16580608</currentMemory><vcpuplacement=&#......
  • 使用Python合并多个Excel文件
    合并Excel可以将多个文件中的数据合并到一个文件中,这样可以帮助我们更好地汇总和管理数据。日常工作中,合并Excel主要有以下两种需求:将多个Excel文件合并为一个文件将多个Excel工作表合并为一个工作表这篇文章将介绍如何使用第三方Python库Spire.XLSforPython实现以上两种......
  • 扫描并清除重复文件的Python脚本
    电脑里存的照片越来越多,其中有很多是重复的。如果依赖人边去一张一张对比,需要的工作量太大了。下面的Python脚本在一个目录树上递归地对所有文件作MD5校验,将重复的文件找出来。保留用户指定的文件,将多余的文件全部删除掉。#!/usr/bin/envpython3importsysimporthashlibim......
  • js判断文件类型详解
    js判断文件类型详解通过file的type属性判断<inputtype="file"onchange="onchangecb(this)"/><script>functiononchangecb(e){constfile=e.files[0];console.log(file.type);}</script>像html中input标签,就是根据选择......
  • Vue—实现文件上传(多文件),图片上传
    一、图片上传//template<inputtype="file"accept="image/*"@change="changeImage()"ref="avatarInput"style="display:none"......