python文件处理

文件操作分为读、写、改

 

 一.文件读取(打开文件,r只读模式,默认模式,文件必须存在)

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

PS: 此处的encoding必须和文件在保存时设置的编码一致,不然“断句”会不准确从而造成乱码。

过程:

1、由应用程序向操作系统发起系统调用open(...)
2、操作系统打开该文件,并返回一个文件句柄给应用程序
3、应用程序将文件句柄赋值给变量f
文件句柄 = open('文件路径', '模式','编码')
 
循环读取文件内容
 
f = open("test.txt",'r',encoding="utf-8")
for line in f:
    print(line)
f.close()
 
文件读取 rb 二进制模式读,文件必须存在。
 
f = open(file='test.txt',mode='rb')
print(f.read().decode('utf8'))
f.close()

 

数据读到内存里直接是bytes格式,看内容,还需要手动decode,因此在文件打开阶段,不需要指定编码
 
 
 二.文件写入(w,只写模式,不可读,不存在则创建,存在则清空内容)
 
f = open(file='test.txt',mode='w',encoding='utf-8')
f.write('llllll')
f.close()
encoding='utf-8'                                     将要写入的unicode字符串编码成utf-8格式
f.write(...)                                         表示写入内容,写入的内容是unicode字符串类型,内部会根据encoding转换为制定编码的 01101010101,即:字节类型

文件写入wb,二进制只写模式,不可读,不存在则创建,存在则清空内容

f = open('a.txt','wb')
print(f.write('hello'.encode('utf8')))
f.close()

追加:把内容追加到文件尾部(不删除之前内容)

f = open(file='test.txt',mode='a',encoding='utf-8')
f.write('llllll')
f.close()

 

 三.文件修改

1.将文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存写到硬盘上(例如:word,vim等编辑器)

import os
with open('test.txt','r',encoding='utf-8') as read_f,open('tmp','w',encoding='utf-8') as write_f:
    data=read_f.read() #全部读入内存,如果文件很大,会很卡
    data=data.replace('aaa','bbb’) #在内存中完成修改
    write_f.write(data) #一次性写入新文件
 
os.remove('a.txt')
os.rename('tmp','a.txt')

 

2.将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件
import os
with open('a.txt','r',encoding='utf-8') as read_f,open('tmp','w',encoding='utf-8') as write_f:
    for line in read_f:
        line=line.replace('aaa','bbb')
        write_f.write(line)
os.remove('a.txt')
os.rename('tmp','a.txt')

 

四.其他

1.使用with不用关闭文件
with open('test.txt','a',encoding='utf-8') as f:
    con = f.write('000')
    print(con)

 

2.模式总结

文本模式

 r,只读模式:默认模式,文件必须存在,不存在则抛出异常

w,只写模式:不可读,不存在则创建,存在则清空内容

a,追加写模式:不可读,不存在则创建,存在则只追加内容

字节模式(对于非文本文件如图片、视频,不用考虑字符编码)

rb,二进制只读模式:默认模式,文件必须存在,不存在则抛出异常

wb,二进制只写模式:不可读,不存在则创建,存在则清空内容

ab,二进制追加写模式:不可读,不存在则创建,存在则只追加内容

读写模式

r+,读写:可读,可写,从文件开头写入

w+,写读:可读,可写,清空后再写

a+,写读:可读,可写,从文件末尾写入

 

3.操作方法

f.read() #读取所有内容,光标移动到文件末尾

f.readline() #读取一行内容,光标移动到第二行首部

f.readlines() #读取每一行内容,存放于列表中,返回一个list

f.write('1111\n222\n') #针对文本模式的写,需要自己写换行符

f.write('1111\n222\n'.encode('utf-8')) #针对b模式的写,需要自己写换行符

f.writelines(['333\n','444\n']) #文件模式

f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式

f.flush() #立刻将文件内容从内存刷到硬盘

f.readable() #文件是否可读

f.writable() #文件是否可读

f.closed #文件是否关闭

f.encoding #如果文件打开模式为b,则没有该属性

 

4.光标操作

f.tell() 读取指针的位置

f.seek(0) 设置指针的位置(0回到开头)

truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果

read(3) 文件打开方式为文本模式时,代表读取3个字符,文件打开方式为b模式时,代表读取3个字节

seek,tell,truncate光标移动都是以字节为单位

seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的

 

5.不知道文件编码的情况

import chardet

f = open('log',mode='rb')
data = f.read()
f.close()

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

 

 输出:

{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}

 百分之九十九的可能为 GB2312

 

posted @ 2019-03-20 15:28  沙中石~  阅读(192)  评论(0编辑  收藏  举报