文件操作

### 文件操作

f写完后:加f.flush()刷新

记住:编码成二进制,解码成字符
二进制的即为bytes字节,字符是人能看懂的

**r** 只读 没有则报错

**w**只写,没有则能创建,有则覆盖空(彻底覆盖,没写的部分也没有了)

**a**只写,能创建,从尾部开始写(append追加模式)

**加b:**
有各种二进制格式打开一个文件的模式,如rb/rb+/wb/wb+/ab/ab+
写:w:\n自动转换为\r\n
     wb:不转换\n
     换行符\t都不会转换

读:r:自动转换换行符、空格符
   rb:不转换换行符、空格符

**w+ 打开文件并读写**
1. 文件存在,则清空(也即写入空);
2. 文件不存在,则创建文件 ;
3. 文件流定位到开始位置, 所以read() 会得到空。

**r+  打开文件并读写**  
1. 文件存在,打开文件,文件指针定位到文件开始位置;
2. 文件不存在, 则报错文件不存在。

**a+  打开文件并读添**
1. 文件存在,打开文件,文件指针定位到文件开始位置,但不清空;
2. 文件不存在,创建文件;
3. 打开后读取时,在文件开头位置,
4. 写入时,添加到文章末尾,并且指针位于添加后的末尾,所以再次读取会乱码。


方法一:
```python
f=open("a.txt","w",encoding = "utf-8")
f.write("abc\n") #在字符串中加\n 换行
f.write("sqd\n")
#f.flush() #没有这条,文件只写在内存,不会进行硬盘操作
f.close() #关闭操作,内存才会释放,并写进硬盘

f=open("a.txt","r",encoding="utf-8")
print(f.read())
print(f.readlines()) # 一次把内容按照列表读出,每行为一个元素 按照迭代器协议实现的
print(f.readline()) #一次读一条,省内存
#或者for i in f:
# print(i)
# 一条条打印出来 且由于写得时候有换行符,print默认参数有个end="\n",所以每条内容间隔空两行
#可以改成: print(i, end="")
```

二进制读取
```python
f=open("a.txt","rb") #由于内存和硬盘本身就是二进制,所以不需要指定编码
print(f.read())
#读出来的数据为二进制,windows下二进制的换行符为 \r\n, linux下是\n

f=open("a.txt","rb")
data = f.read() #读出二进制
data = data.decode("utf-8") #二进制解码成字符串
print(data)
>>>abc
>>>sqd
```

需求:把a.txt内容中的“a”改成“0”
7bc33460d7848930fc0035d6a3535683.png  
在i的处理过程中需要注意:
image.png  

方法二:with语句
c39c48bdb1eb5f9eefcc3376ea34fb18.png  

二进制编码
bcac0c50359654d0449f7494eedba69b.png  

不指定操作模式,默认以t(文本模式)处理,需要编码解码

a:追加方式写

b:以二进制防止读写时,与字符没关系,一定不能指定encoding!

b模式:打开图片视频 或 操作硬盘上的所有类型的文件等等
以b模式打开图片文件,与文本无关,不能编码解码
b读出来的都是bytes类型,如果是文本类文件,要想能看懂,把读到的内容decode一下就行
3d113501e85b40da5aeec3e740e461ab.png  
注意:b也能写文本文件,但内容需要编码成字符串,再write

ab模式:二进制追加,写文本时 内容需要encode再 write

 


### 文件修改(只有两种方式)
#### 修改文件方式一:
1、先把文件内容全部读入内存
2、然后在内存中完成修改
3、再把修改后的结果覆盖写入原文件
缺点:会在文件内容过大的情况下,占用过多的内存
```python
with open('user.txt',mode='r',encoding='utf-8') as f:
data=f.read()
data=data.replace('吴佩其','吴佩其[老男孩第二帅的人]')

with open('user.txt',mode='w',encoding='utf-8') as f:
f.write(data)
```

#### 修改文件方式二:
1、以读的方式打开原文件,以写的方式打开一个新文件
2、移除原文件,重命名新的文件
缺点:需要打开两个文件,在过程中,占了两份内存空间
```python
import os

with open('user.txt',mode='rt',encoding='utf-8') as read_f,\
open('user.txt.swap',mode='wt',encoding='utf-8') as write_f:

for line in read_f:
if '吴佩其' in line:
line=line.replace('吴佩其','吴佩其[老男汉特别特别的老]')
write_f.write(line)

os.remove('user.txt')
os.rename('user.txt.swap','user.txt')
```

posted @ 2019-08-14 15:11  坚持fighting  阅读(148)  评论(0编辑  收藏  举报