首页 > 其他分享 >文件读写

文件读写

时间:2022-11-07 20:26:23浏览次数:29  
标签:文件 utf f1 读写 模式 mode open

使用Python来读写文件是非常简单的操作,使用open()来打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行各种各样的操作

根据打开方式的不同能够执行的操作会有相应的差异.

打开文件的方式:

  • r,w,a

  • rb,wb,ab

  • r+,w+,a+

  • r+b,w+b,a+b

一. 读操作

1.1 r模式

我们先来看看这个只读操作,听名字应该也知道只能进行读不能进行别的操作

f = open('联系方式.txt',mode='r',encoding='utf-8')
content = f.read()
f.close()

open中第一个参数放入的是要打开的文件名字,第二个参数是要对这个文件进行的操作,第三参数是用什么编码方式打开文件中的内容

  • f 可写成任意变量等,它被称作:文件句柄,文件操作符,或者文件操作对象等

  • open 是Python调用操作系统的功能,windows的默认编码方式为gbk,linux默认编码方式为utf-8,所以你的文件用什么编码保存的,就用什么方法打开,一般都是用utf-8

  • mode为打开方式,默认不写是r。 流程就是打开文件,产生一个文件句柄,对文件句柄进行相应操作

1.2 rb 模式

再看看rb只读字节的模式

f = open('联系方式.txt',mode='rb')
content = f.read()
print(content)
f.close()

结果:
b'\xe6\xa0\x87\xe9\xa2\x98\xe5\xbe\x88\xe5\xa5\xbd'

rb 读出来的数据是bytes类型,在rb模式下,不能指定encoding

rb的作用:

  • 在读取非文本文件的时候,比如要读取mp3,图像,视频等信息的时候就需要用到rb,因为这种数据是没办法直接显示出来的

  • 这个字节的模式是用于传输和存储

对于读写模式,必须是先读后写,因为光标默认在开头位置,当读完了以后再进行写入.我们以后使用频率最高的模式就是r+

1.3 r+模式

看下正确的操作:

f1 = open('../path1/小娃娃.txt',mode='r+',encoding='utf-8')
msg = f1.read()
f1.write('这支烟灭了以后')
f1.flush()
f1.close()

结果:
正常的读取之后,写在结尾

看下错误的操作:

f1 = open('../path1/小娃娃.txt',mode='r+',encoding='utf-8')
f1.write('小鬼')
msg = f1.read()
f1.flush()
f1.close()

结果:
这样写会把小鬼写在开头,并且读出来的是小鬼之后的内容

r+模式一定要记住是先读后写

r+模式深坑请注意:

  • 在r+模式下. 如果读取了内容. 不论读取内容多少. 光标显示的是多少. 再写入或者操作文件的时候都是在结尾进行的操作

r+b模式与r+模式相似

二. 写操作

2.1 w模式

在写文件的时候我们要养成一个写完文件就刷新的习惯:刷新flush()

f = open('../path1/小娃娃.txt',mode='w',encoding='utf-8')
f.write('太白很白')
f.flush()
f.close()

注意: 如果文件不存在,使用w模式会创建文件,文件存在,w模式是覆盖写,在打开文件时会把文件中所有的内容清空

尝试读一读:

f1 = open('../path1/小娃娃.txt',mode='w',encoding='utf-8')
msg = f1.read()
print(msg)

结果:
Traceback (most recent call last):
  File "D:/python_object/path2/test.py", line 563, in <module>
    msg = f1.read() 
io.UnsupportedOperation: not readable    #模式是w,不可以执行读操作

2.2 wb模式

wb模式下,不可以指定打开文件的编码方式,但是写文件的时候必须将字符串转换成utf-8的bytes数据

f = open('../path1/小娃娃.txt',mode='wb')
msg = '你好'.encode('utf-8')
f.write(msg)
f.flush()  # 刷新
f.close()

2.3 w+模式

先将所有的内容清空,然后写入.最后读取.但是读取的内容是空的,不常用

f1 = open('../path1/小娃娃.txt',mode='w+',encoding='utf-8')
f1.write('小鬼')
msg = f1.read()
f1.flush()
f1.close()
print(msg)

w+b模式与w+模式相似

三. 写读模式

3.1 a模式

不论光标在何位置,在a追加模式下,写入的内容都追加在文件的末尾

a模式如果文件不存在就会创建一个新文件

f1 = open('../path1/小娃娃.txt',mode='a',encoding='utf-8')
msg = f1.write('这支烟灭了以后')

ab这个模式与a相似

3.2 a+追加读

a+模式下,不论是先读还是后读,都是读不到数据的

f = open('../path1/小娃娃.txt',mode='a+',encoding='utf-8')
f.write('阿刁')
f.flush()
msg = f.read()
f.close()
print(msg)

a+b模式与a+模式相似

四. 其他相关操作

4.1 文件路径

绝对路径:从根目录下开始一直到文件名
相对路径:同一个文件夹下面的文件,直接写文件名就可以

我们在使用绝对路径的时候因为有\,这样程序是不能识别的,解决方法:

open('C:\Users\Meet')  #这样程序是不识别的

解决方法一:
open('C:\\Users\\Meet') #这样就成功的将\进行转义   两个\\代表一个\

解决方法二:
open(r'C:\Users\Meet') #这样相比上边的还要省事,在字符串的前面加个小r也是转义的意思  推荐使用这种

更推荐大家使用相对路劲,因为我把这个程序的整个文件发给你的时候,就可以运行,如果使用绝对路径还需要额外的拷贝外部文件给你

4.2 seek()

seek(n)光标移动到n位置,注意: 移动单位是byte,所有如果是utf-8的中文部分要是3的倍数

通常我们使用seek都是移动到开头或者结尾

移动到开头:seek(0,0)

移动到当前位置:seek(0,1)

移动到末尾:seek(0,2)

移动1个字:seek(3) 移动光标是按照字节进行移动

f = open("小娃娃", mode="r+", encoding="utf-8")
f.seek(0) # 光标移动到开头
content = f.read() # 读取内容, 此时光标移动到结尾
f.seek(0) # 再次将光标移动到开头
f.seek(0, 2) # 将光标移动到结尾
content2 = f.read() # 读取内容. 什么都没有
f.seek(0) # 移动到开头
f.write("张国荣") # 写入信息. 此时光标在9 中文3 * 3个 = 9
f.flush()
f.close() 

4.3 tell()

使用tell()可以帮我们获取当前光标在什么位置

f = open("小娃娃", mode="r+", encoding="utf-8")
f.seek(0) # 光标移动到开头
content = f.read() # 读取内容, 此时光标移动到结尾
f.seek(0) # 移动到开头
f.write("张国荣") # 写入信息. 此时光标在9 中⽂文3 * 3个 = 9
print(f.tell()) # 光标位置9
f.flush()
f.close()

4.4 修改文件

文件修改: 只能将文件中的内容读取到内存中, 将信息修改完毕, 然后将源文件删除, 将新文件的名字改成老文件的名字

import os
with open("../path1/小娃娃", mode="r", encoding="utf-8") as f1,\ #with open会自动关闭文件
open("../path1/小娃娃_new", mode="w", encoding="UTF-8") as f2:
    content = f1.read()
    new_content = content.replace("冰糖葫芦", "⼤白梨")
    f2.write(new_content)
os.remove("../path1/小娃娃") # 删除源文件
os.rename("../path1/小娃娃_new", "小娃娃") # 重命名新文件

弊端: ⼀次将所有内容进行读取. 内存溢出. 解决方案: 一行一行的读取和操作

import os
with open("小娃娃", mode="r", encoding="utf-8") as f1,\
open("小娃娃_new", mode="w", encoding="UTF-8") as f2:
    for line in f1:
        new_line = line.replace("大白梨", "冰糖葫芦")
        f2.write(new_line)
os.remove("小娃娃") # 删除源⽂文件
os.rename("小娃娃_new", "小娃娃") # 重命名新文件

4.5 打开文件open

我们都知道打开文件有两种方法:

  • f = open()
  • with open() as f:

这两种方法的区别就是第一种方法需要我们自己关闭文件;f.close(),而第二种方法不需要我们自己关闭文件,无论是否出现异常,with都会自动帮助我们关闭文件

标签:文件,utf,f1,读写,模式,mode,open
From: https://www.cnblogs.com/vahan/p/16867283.html

相关文章

  • springboot 上传文件设置文件大小限制
     报错内容:org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size exceeded; nested exception is java.lang.IllegalStateExce......
  • mybatis-config配置文件各项简单介绍
     以下为mybatis-config里面可以配置的各个设置项的介绍(并非每一项都需要配置,在spirngboot项目里,不做任何配置也是可以的,因为有默认的配置):1.<!–配置全局性ca......
  • Linux 挂载Windows共享文件夹和NAS存储
    summary:[Linux挂载共享存储]概述将Windows共享文件夹和NAS存储挂载至Linux。Linux系统环境:CentOS挂载共享存储查看外部主机共享了哪些目录smbclient-L//10.1......
  • linux 删除旧文件
    find目录-typef-mtime+5-execrm-f{}\;Linux操作系统的/tmp目录保存临时文件,那么这个目录下的临时文件究竟会保存多久,何时被清理,通过什么方式(哪个服务)来维护清......
  • bat批处理打开文件路径或者程序
    PEM打开程序@echooffstart/min"""D:\ProgramFiles\Xshell\Xshell.exe"PEM设置延时时间timeout/t10start/min"""D:\ProgramFiles\SecureCRT\SecureCRT.exe"RE......
  • 多线程同步之读写锁
    对于多线程程序来说,同步是指在一定的时间内只允许某一个线程访问某个资源。而在此时间内,不允许其他的线程访问该资源。同步资源的方式:互斥锁、条件变量、读写锁、信号......
  • vs如何分析dump文件
    首先保证Dump文件和dll文件在同一路径下1、用Vs打开dump文件,做出如下配置A、设置符号路径2、打开文件资源管理器的属性进行设置......
  • vue2.0引入css文件后报错
    vue2.0的main.js中引入css文件后报错。报错示例:UncaughtError:Moduleparsefailed:/Users/**/Desktop/vue2/node_modules/.1.0.0-rc.5@element-ui/lib/theme-default/i......
  • Python获取MySQL的创建表sql到文件中
    importosimportpymysqlpath=r'D:\Projects\sql'ifnotos.path.isdir(path):os.mkdir(path)conn=pymysql.connect(host='192.168.1.17',user='root',......
  • spring cloud项目中子模块未识别spring boot问题,java文件出现橘黄色点。未识别spring
    springcloud项目中子模块未识别springboot问题,java文件出现橘黄色点。未识别springboot在springcloud项目下,子模块出现未识别问题。如图springboot模块未识别情况。......