python文件处理

目录

1、文件打开模式的含义列表

2、文件处理(读、写、追加、修改、删除)



 

1、文件打开模式的含义列表

模式含义
r 文本只读模式
rb 二进制模式 这种方法是用来传输或存储,不给人看的
r+ 读写模式,只要有r,那么文件必须存在
rb+ 二进制读写模式
w 只写模式,不能读,用w模式打开一个已经存在的文件,如果有内容会清空,重新写
wb 以二进制方式打开,只能写文件,如果不存在,则创建
w+ 读写模式,先读后写,只要有w,会清空原来的文件内容
wb+ 二进制写读模式
a 追加模式,也能写,在文件的末尾添加内容
ab 二进制追加模式
a+ 追加模式,如果文件不存在,则创建文件,如果存在,则在末尾追加
ab+ 追读写二进制模式,从文件顶部读取文件,从文件底部添加内容,不存在则创建

 

2、文件处理(读、写、追加、修改、删除)

读文件

f = open('E:\python\python第三章\staff_table.txt',mode='r',encoding='utf-8') 
#
'E:\python\python第三章\staff_table.txt' 表示文件路径
# mode='r' 表示只读(可以修改其他(r))
# encoding='utf-8' 表示将硬盘上的 0101010 按照utf-8的规则去“断句”,再将“断句”后的每一段0101010转换成unicode的 01010101,unicode对照表中有01010101和字符的对应关系。
d = f.read() # 表示读取所有内容,内容是已经转换完毕的字符串。
print(d)
f.close() # 表示关闭文件

问题:假如读取的时候不知道处理的文件是何种编码怎么办呢?

首先我们需要导入一个工具chardet(字符编码判断)

看代码:

import chardet
f = open('user.txt',mode='rb')
data = f.read()
f.close()
print(chardet.detect(data))
# 输出
{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}

注意

1) 文件操作时,以 “r”或“rb” 模式打开,则只能读,无法写入;

2) 硬盘上保存的文件都是某种编码的0101010,打开时需要注意:

3) rb,直接读取文件保存时原生的0101010,在Python中用字节类型表示

4) r和encoding,读取硬盘的0101010,并按照encoding指定的编码格式进行断句,再将“断句”后的每一段0101010转换成unicode的 010101010101,在Python中用字符串类型表示

问题如果文件特别大,内存又特别小;打开文件,就会撑爆内存,运行速度相当慢!用什么办法解决?

用循环文件;看代码:

1 f = open('user.txt','r',encoding='utf-8')
2 for line in f:
3     print(line)
4 f.close()
5 # 即!一行一行的读

写文件:

 

1 f = open('user.txt','w',encoding='utf-8') # w表示写
2 f.write('奔跑后自由')
3 f.close()

 

二进制写法:

1 f = open('user.txt','wb') # wb 表示只以二进制的方式写进去
2 f.write('奔跑后自由'.encode('gbk')) # 表示写入内容,写入时必须指定字符编码!
3 f.close()

注意:

注意:

1) 文件操作时,以 “w”或“wb” 模式打开,则只能写,并且在打开的同时会先将内容清空。

2) 写入到硬盘上时,必须是某种编码的0101010,打开时需要注意:

3) wb,写入时需要直接传入以某种编码的0100101,即:字节类型

4) w 和 encoding,写入时需要传入unicode字符串,内部会根据encoding制定的编码将unicode字符串转换为该编码的 010101010

问题w+和r+有什么区别?

答:w+是文件存在清空内容,然后写入:若文件不存在则创建文件。

    r+是以可读写方式打开,文件必须存在。

追加

 

1 f = open('user.txt','ab')
2 f.write('\n会心一笑'.encode('gbk'))
3 f.close()

 

注意

1) 文件操作时,以 “a”或“ab” 模式打开,则只能追加,即:在原来内容的尾部追加内容

2) 写入到硬盘上时,必须是某种编码的0101010,打开时需要注意:

3) ab,写入时需要直接传入以某种编码的0100101,即:字节类型

a)  和 encoding,写入时需要传入unicode字符串,内部会根据encoding制定的编码将unicode字符串转换为该编码的 010101010

修改文件

问题:追加只能追加在尾部,那如果我想修改任意位置的文件呢?

文件操作常用函数

 

先看导图,然后看代码:

 # 占硬盘的方式来修改
1
import os 2 f_name = "E:\python\python第三章\Write.txt" 3 f_new_name = "%s.name"%f_name 4 str = "有人25岁就当上CEO,却在50岁去世。" 5 new_str = "有人25岁就当爸,然在30岁做了CEO" 6 f = open(f_name,'r',encoding='UTF-8') 7 f_new = open(f_new_name,'w',encoding='UTF-8') 8 for line in f: 9 if str in line: 10 new_line = line.replace(str,new_str) 11 else: 12 new_line = line 13 f_new.write(new_line) 14 f.close() 15 f_new.close() 16 os.replace(f_new_name,f_name)
 1 # 占内存的方法修改文件
 2 f = open('E:\python\python第三章\Write.txt','r+',encoding='utf-8')
 3 data = f.read()
 4 str = '有人25岁就当上CEO,却在50岁去世。'
 5 new_str = '有人25岁就当爸,然在30岁做CEO'
 6 new_data = data.replace(str,new_str)
 7 f.seek(0)
 8 f.truncate()
 9 f.write(new_data)
10 f.close()

删除文件

1 with open('E:\python\python第三章\Write.txt','r',encoding='utf-8') as f:
2     f1 = f.readlines()
3     with open('E:\python\python第三章\Write.txt','w',encoding='utf-8')as f_w:
4         for line in f1:
5             if '也有人50岁才当上CEO,然后活到90岁。' in line:
6                 continue
7             f_w.write(line)

问题:区别readlines和readline、read

read() 方法用于从文件读取指定的字节数,如果未给定或为负则读取所有。

readline() 只读一行,遇到\r or \n为止

readines() 读取整个文件所有行,保存在一个列表(list)变量中,每行作为一个元素,但读取大文件会比较占内存。

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2018-06-16 14:32  C眼睛  阅读(152)  评论(0)    收藏  举报