博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python中文件的读写操作
阅读量:5327 次
发布时间:2019-06-14

本文共 3386 字,大约阅读时间需要 11 分钟。

文件操作基本流程:

1. 介绍

计算机系统是由计算机硬件,操作系统,和应用程序三部分组成.

内存 存放不持久

硬盘 可以使数据持久化

文件操作  数据持久化的一种

全栈开发  框架类

2. 文件的操作流程

打开文件, 得到文件句柄并赋值给变量f = open("a.txt","r",encoding="utf-8") 通过句柄对文件操作data=f.read() 关闭 文件 f.close()

只读操作(**r, **rb)

f = open("护士少妇嫩模.txt",mode="r",encoding="utf-8")

content = f.read()

print(content)

f.close()

rb 读出来的数据是bytes类型,在rb模式下,不能选择encoding.

rb的作用:在读取非文本文件的时候. 比如图片,MP3,视频等就需要用到rb.因为这种数据没办法直接显示出来.

f = open("护士少妇嫩模.txt",mode="rb")

content=f.read()

print(content)

f.close()

读取文件的方法:

read() 是将文件中所有的内容读出来

read(n) 是读取n个字符.

比如:  友谊地久天长

read(3)  结果就是  "友谊地"  把前三个字读出来. 需要注意的是,如果再次读取, 会在当前位置继续往后读,而不是从头开始读.  例如,再来一个read(3) 得到的结果就是 "久天长"

如果是rb模式, 就是读3个字节

readline() 一次读取一行数据. 注意:每次读取出来的数据都会有一个换行符 \n, 我们要使用strip()方法去掉\n

readlines()将一行形成一个元素,放到一个列表中. 占内存  不推荐使用.

 

*** 循环读取, 每次读一行内容. 不会产生内存溢出

f = open("a.txt",mode="r",encoding="utf-8")

for line in f:

  print(line.strip())

f.close()     一定要注意关闭

 

写模式(**w,wb)

写的时候,如果没有文件,就会先创建文件; 如果文件存在就会将原来的内容先删除, 再写入新的内容.

f = open("小娃娃.txt",mode="w",encoding="utf-8")

f.write("金毛狮王")

f.flush() #刷新

f.close()

wb模式: 可以不指定打开文件的编码,但是在写入文件的时候必须把字符转换成"utf-8"

 

f = open("小娃娃.txt",mode="wb")

f.write("金毛狮王", encoding("utf-8"))

f.flush() #刷新

f.close()

 

追加(**a,ab)

在追加的模式下,写入的内容会追加在文件的结尾

f = open("小娃娃",mode="a",encoding="utf-8")

f.write("马化腾")

f.flush()

f.close()

读写模式(**r+, r+b)

读写模式必须是先读. 因为默认光标在开头,读完之后再写入. r+模式是以后使用频率最高的.

f = open("小娃娃",mode="r+",encoding="utf-8")

content = f.read()

f.write("马化腾的汽车") #会接着原来的内容继续往后写,没有换行

print(content)

f.flush()

f.close()

写读模式(w+, w+b )

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

追加读(a+)

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

追加都是在最后的位置,先读的话,后面没内容,读不出来, 如果写完再读,光标还是在最后 ,还是读不到内容.

 

***其他操作

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

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

移动到结尾: seek(0,2) seek的第二个参数表示的是从哪个位置进行偏移,默认是0,表示开头, 1表示当前位置, 2表示结尾

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

2. tell() 帮忙找到当前光标的位置

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

3. truncate()截断文件

 

#truncate() 截断文件f = open("小娃娃",mode="w",encoding="utf-8")f.write("哈哈") #写入2个字符f.seek(3) #光标移动到3, 也就是两个字的中间f.truncate() #删除光标后面的所有内容f.close()

 

f = open("小娃娃",mode="r+",encoding="utf-8")content=f.read(3) #读取12个字符f.seek(4) #移动4个byteprint(f.tell())f.truncate()#后面的所有内容全部删除f.flush()f.close()

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

 

***修改文件

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

 

##文件修改import oswith open("小娃娃",mode="r",encoding="utf-8") as f1,\    open("小娃娃_new",mode="w",encoding="utf-8") as f2:    content = f1.read()    new_content = content.replace("冰糖葫芦","大白梨")    f2.write(new_content)os.remove("小娃娃")  #删除源文件os.rename("小娃娃_new","小娃娃") #重新命名新文件

 

弊端:一次将所有内容读出来,内存溢出. 可以一行一行读取.

import oswith 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","小娃娃") #重新命名新文件

 

转载于:https://www.cnblogs.com/kenD/p/9431608.html

你可能感兴趣的文章
当心JavaScript奇葩的逗号表达式
查看>>
App Store最新审核指南(2015年3月更新版)
查看>>
织梦MIP文章内容页图片适配百度MIP规范
查看>>
点击复制插件clipboard.js
查看>>
[Kali_BT]通过低版本SerialPort蓝牙渗透功能手机
查看>>
C语言学习总结(三) 复杂类型
查看>>
HNOI2018
查看>>
【理财】关于理财的网站
查看>>
Ubunt中文乱码
查看>>
《当幸福来敲门》读后
查看>>
【转】系统无法进入睡眠模式解决办法
查看>>
省市县,循环组装,整合大数组
查看>>
stm32中字节对齐问题(__align(n),__packed用法)
查看>>
like tp
查看>>
posix多线程有感--线程高级编程(线程属性函数总结)(代码)
查看>>
spring-使用MyEcilpse创建demo
查看>>
DCDC(4.5V to 23V -3.3V)
查看>>
kettle导数到user_用于left join_20160928
查看>>
activity 保存数据
查看>>
typescript深copy和浅copy
查看>>