文件处理--文件操作

1、w 写模式,它是不能读的,如果用w模式打开一个已经存在的文件,会清空以前的文件内容,重新写
# w+ 是读写内容,只要沾上w,肯定会清空原来的文件
# 2、r 读模式,只能读,不能写,而且文件必须存在
# r+ 是读写模式,只要沾上r,文件必须存在
# 3、a 追加模式,也能写,在文件的末尾添加内容
# 4、rb+、wb+、ab+,这种是二进制模式打开或者读取,一些音乐文件

open("web.log",'rb+',encoding='utf-8')

文件操作分为读、写、修改,我们先从读开始学习

 

with open('/path/to/file', 'r') as f:   #Python引入了with语句来自动帮我们调用close()方法
print(f.read())            #如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便:

f = open(file='d:/工作日常/兼职白领学生空姐模特护士联系方式.txt',mode='r'encoding='utf-8')

data = f.read()

f.close()

原码:

f = open(file="D:/工作日常/兼职白领学生空姐模特护士联系方式.txt",mode="r",encoding ='gbk')
data = f.read()
print(data)
f.close()

mode="r"   -文本只读模式
mode="rb"  - 二进制模式  #这种方法,是用来传输,不给人看的。

智能检测编码的工具 chardet
import chardet
f = open('log',mode = 'rb')
data = f.read()
f.close()

result = chardet.detect(open('log',mode='rb'),read())
print(result)

Python 模块chardet安装 setup.py
1、到http://pypi.python.org/pypi/chardet#downloads下载chardet-2.1.1.tar.gz;解压到site-package文件夹,后怎么安装呢?
2、解压后 把 chardet 目录 直接拷贝到 python安装目录下的 Lib/site-packages/  下,即可
rb打开文件是指二进制模式,数据读到内存是直接是bytes格式,如果想看内容,还需要手动decode,因此在文件打开阶段,不需要指定编码。
检测是什么编码的文件,(unicode 或 utf-8)
import chardet
f = open('目录',mode = 'rb')
data = f.read()


data.decode("gb2312")
print(result)

#一行一行循环读文件

read 几种模式 文本模式的r 、rb、 二进制的模式。

不带‘b ’的要写encoding ,带'b'的不需要写encoding.(是二进制)
#写文件
例:
f = open("兼职.txt",'w',encoding='gbk')
f.write("路飞学城!"encode('gbk'))
f.close()
f = open("兼职2.txt",'wb')
f.write("原子二号".encode('gbk'))
f.close()

#写就只有w 和wb 两种模式

#追加模式操作文件
参数“a”追加模式(追加到最后)
f = open("兼职2.txt",'a')
f.write("\n肛娘 北京 167 55 13523230322".encode('gbk'))
f.close()

#混合操作文件
'r+' 读写混合模式
f = open("兼职白领学生空姐模特护士联系方式.txt",'r+',encoding='gbk')
data = f.read()
print("content",data)

f.write("\nnewline 1哈哈")
f.write("\nnewline 2哈哈")
f.write("\nnewline 3哈哈")
f.write("\nnewline 4哈哈")

print("new content",f.read())

#写读模式
f = open("兼职白领学生空姐模特护士联系方式.txt",'w+',encoding='gbk')
data = f.read()
print("content",data)

f.write("\nnewline 1哈哈")
f.write("\nnewline 2哈哈")
f.write("\nnewline 3哈哈")
f.write("\nnewline 4哈哈")

print("new content",f.read())

之前写的会被覆盖,新写的会显示。基本用这上写读模式

#文件操作做其它功能
flush(self, *args, **kwargs): # real signature unknow把文件从内存buffer
里强制刷新到硬盘

readable(self, *args, **kwargs):#real signature unknown 判断是否可读

readline(self, *args, **kwargs):#real signature unknown 只读一行,
遇到\r or \n为止

seek(self, *args, **kwargs):#real signature unknown
把操作文件的光标移到指定位置
*注意seek的长度是按字节算的,字符编码存每个字符所占的字节长度不一样。
如“路飞学城”用gbk存是2个字节一个字,用utf-8就是3个字节,因此以gbk
打开时,seek(4)就把光标切换到,但如果是utf8,seek(4)会导致,拿到了飞这个
字的一部分字节,打印的话会报错,因为处理剩下的文本时发现
seekable(self, *args, **kwargs):#real signature unknown
判断文件是否可进行seek操作

tell(self, *args, **kwargs)#real signature unknown
判断文件是否可进行seek操作
truncate(self, *args, **kwargs):#real signature unknown
按指定长度截断文件
*指定长度的话,就从文件开头开始截断指定长度,不指定长度的话,就从当前
位置到文件尾部的内容全去掉。

writable(self, *args, **kwargs):#real signature unknown
判断文件是否可写

tell seek 是按字节算的,read是按字符算的。

seekable 二进制文件都可以seek

#修改文件
f = open("兼职白领学生空姐模特护士联系方式utf8.txt",'r+',encoding"utf-8")
f.seek(6)
f.write("[路飞学城]")
f.close()
#文件修改功能
#例:文件修改占硬盘
import os #导入工具箱
f_name = "兼职白领学生空姐模特护士联系方式.txt"
f_new_name = "%s.new"%f_name

old_str = "乔亦菲"
new_str = "肛娘"

f = open(f_name,"r",encoding="utf-8")
f_new = open(f_new_name,"w",encoding="utf-8")

for line in f:
if old_str in line:
line =line.replace(old_str,new_str)

f_new.write(line)
f.close()
f_new.close()

os.rename(f_new_name,f_name) #重命名


#例:文件修改占内存
f_name = "兼职白领学生空姐模特护士联系方式.txt"

old_str = "肛娘"
new_str = "乔亦菲"

file_data = ""
with open(f_name, "r", encoding="utf-8") as f:
for line in f:
if old_str in line:
line = line.replace(old_str, new_str)
file_data += line
with open(f_name, "w", encoding="utf-8") as f:
f.write(file_data) # for line in f:
f.close()
 






posted @ 2018-01-29 15:18  andyzhang-  阅读(220)  评论(0编辑  收藏  举报