过程
a、找到文件
b、打开文件
c、读取文件的内容 d、关闭文件
找到文件
绝对路径:从根目录开始链接的路径
相对路径:不是从根目录开始链接的路径
path = <span class="hljs-string">r"file.txt"</span>
打开文件
原型
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">open</span><span class="hljs-params">(file, mode=<span class="hljs-string">'r'</span>, buffering=None, encoding=None, errors=None, newline=None, closefd=True)</span>
</span>
参数
file:要打开的文件的路径
mode:打开方式
返回值
文件描述符,从当前的位置操作当前打开的文件
打开方式
方式 | 说明 |
---|---|
r | 以只读的方式打开文件,文件的引用(描述符)将会被放在文件开头 |
rb | 以二进制格式打开只读文件,文件的引用(描述符)将会被放在文件开头 |
r+ | 以读写的方式打开文件,文件的引用(描述符)将会被放在文件开头 |
w | 以只写的方式打开文件,如果该文件存在,则将其内容覆盖,如果文件不存在则会创建该文件 |
wb | 以二进制格式打开只写文件,如果该文件存在,则将其内容覆盖,如果文件不存在则会创建该文件 |
w+ | 以读写的方式打开文件,如果该文件存在,则将其内容覆盖,如果文件不存在则会创建该文件 |
a | 打开一个文件用于追加内容,如果该文件存在,文件描述符会被放到文件的末尾,如果文件不存在则会创建该文件 |
a+ | 打开一个文件用于读写,如果该文件存在,文件描述符会被放到文件的末尾,如果文件不存在则会创建该文件 |
打开
打开普通文件
fp = open(path, <span class="hljs-string">"r"</span>)
打开二进制文件
fp = open(path, <span class="hljs-string">"rb"</span>)
指定编码格式
fp = open(path, <span class="hljs-string">"r"</span>, encoding=<span class="hljs-string">"utf-8"</span>)
指定错误处理方式
fp = open(path, <span class="hljs-string">"r"</span>, encoding=<span class="hljs-string">"utf-8"</span>, errors=<span class="hljs-string">"ignore"</span>)
读取文件的内容
读取文件的全部内容
str1 = fp.read()
print(str1)
读取指定字节数的内容
str2 = fp.read(<span class="hljs-number">4</span>)
print(str2)
读取整行内容(包括\n字符)
str3 = fp.readline()
print(<span class="hljs-string">"*"</span>+str3+<span class="hljs-string">"*"</span>)
读取指定字节数内容
str4 = fp.readline(<span class="hljs-number">13</span>)
print(<span class="hljs-string">"*"</span>+str4+<span class="hljs-string">"*"</span>)
读取所有行并返回一个列表,列表中的元素是每行内容
list5 = fp.readlines()
print(list5)
修改文件描述符的位置
str6 = fp.read(<span class="hljs-number">4</span>)
print(<span class="hljs-string">"*"</span>+str6+<span class="hljs-string">"*"</span>)
str7 = fp.read(<span class="hljs-number">4</span>)
print(<span class="hljs-string">"*"</span>+str7+<span class="hljs-string">"*"</span>)
<span class="hljs-comment">#修改文件描述符的位置</span>
fp.seek(<span class="hljs-number">1</span>)
str8 = fp.read(<span class="hljs-number">4</span>)
print(<span class="hljs-string">"*"</span>+str8+<span class="hljs-string">"*"</span>)
关闭文件
注意
文件使用过后必须关闭
原因
释放资源,系统能打开的文件个数是有限制的,所以需要释放相应文件的文件描述符
关闭方式
程序结束自动关闭:程序结束时会释放文件对象的空间,文件会关闭,但是不建议这样来做,最好手动关闭
示例
fp.close()
<span class="hljs-keyword">try</span>:
fp = open(<span class="hljs-string">"file.txt"</span>, <span class="hljs-string">"r"</span>)
print(fp.read())
<span class="hljs-keyword">finally</span>:
<span class="hljs-keyword">if</span> fp:
fp.close()
<span class="hljs-keyword">with</span> open(<span class="hljs-string">"file.txt"</span>, <span class="hljs-string">"r"</span>) <span class="hljs-keyword">as</span> fp:
print(fp.read())
过程
刷新缓冲区方式
找打文件
path = <span class="hljs-string">"file.txt"</span>
打开文件
fp = open(path, <span class="hljs-string">"w"</span>)
将内容写入缓冲区
fp.write(<span class="hljs-string">"sunck good"</span>)
手动刷新缓冲区
fp.flush()
关闭文件
fp.close()
<span class="hljs-keyword">try</span>:
fp = open(<span class="hljs-string">"file.txt"</span>, <span class="hljs-string">"w"</span>)
fp.write(<span class="hljs-string">"cool man"</span>)
<span class="hljs-keyword">finally</span>:
<span class="hljs-keyword">if</span> fp:
fp.close()
<span class="hljs-keyword">with</span> open(<span class="hljs-string">"file.txt"</span>, <span class="hljs-string">"w"</span>) <span class="hljs-keyword">as</span> fp:
fp.write(<span class="hljs-string">"cool man"</span>)
<span class="hljs-keyword">with</span> open(<span class="hljs-string">"file.txt"</span>, <span class="hljs-string">"wb"</span>) <span class="hljs-keyword">as</span> fp:
s = <span class="hljs-string">"sunck is a good man凯"</span>
s = s.encode(<span class="hljs-string">"utf-8"</span>)
fp.write(s)
<span class="hljs-keyword">with</span> open(<span class="hljs-string">"file.txt"</span>, <span class="hljs-string">"rb"</span>) <span class="hljs-keyword">as</span> fp:
s = fp.read()
s = s.decode(<span class="hljs-string">"utf-8"</span>)
print(s)
作用
使用chardet检测编码,支持检测中文、日文、韩文等多种语言
安装
pip install chardet
使用
<span class="hljs-keyword">import</span> chardet
<span class="hljs-comment"># 注意:数据量小,猜测的不准</span>
data = <span class="hljs-string">"凯哥是一个好男人"</span>.encode(<span class="hljs-string">"gbk"</span>)
<span class="hljs-comment"># print(data)</span>
ret = chardet.detect(data)
print(ret, type(ret))
<span class="hljs-string">'''
encoding:表示编码格式
confidence:表示检测的正确的概率
language:表示数据的语言
'''</span>
<span class="hljs-string">'''
GBK是GB2312的超集,两者是同一种编码
'''</span>
info = data.decode(ret[<span class="hljs-string">"encoding"</span>])
print(info)
pickle模块
持久化保存对象,将list、tuple、dict、set等数据序列化存储到文件
<span class="hljs-keyword">import</span> pickle
存储
user = {<span class="hljs-string">"account"</span>: <span class="hljs-string">"sunck"</span>, <span class="hljs-string">"passwd"</span>: <span class="hljs-string">"666"</span>}
<span class="hljs-keyword">with</span> open(<span class="hljs-string">"file.txt"</span>, <span class="hljs-string">"wb"</span>) <span class="hljs-keyword">as</span> fp:
pickle.dump(user, fp)
读取
<span class="hljs-keyword">with</span> open(<span class="hljs-string">"file.txt"</span>, <span class="hljs-string">"rb"</span>) <span class="hljs-keyword">as</span> fp:
user = pickle.load(fp)
print(user, type(user))
作用
数据的读写不一定都是文件,也可以是内存中读写,StringIO可以在内存中读写字符串
导入
<span class="hljs-keyword">from</span> io <span class="hljs-keyword">import</span> StringIO
写
fp = StringIO()
fp.write(<span class="hljs-string">"sunck is\n"</span>)
fp.write(<span class="hljs-string">" a good "</span>)
fp.write(<span class="hljs-string">"man!"</span>)
<span class="hljs-comment"># 获取写入的内容</span>
print(fp.getvalue())
读
fp.seek(<span class="hljs-number">0</span>)
print(fp.read())
fp.seek(<span class="hljs-number">0</span>)
print(fp.readline())
fp.seek(<span class="hljs-number">0</span>)
print(fp.readlines())
注意:文件使用后关闭文件
作用
数据的读写不一定都是文件,也可以是内存中读写,StringIO只能操作字符串,BytesIO可以操作二进制数据
使用
<span class="hljs-keyword">from</span> io <span class="hljs-keyword">import</span> BytesIO
fp2 = BytesIO()
fp2.write(<span class="hljs-string">"sunck is a nice man"</span>.encode(<span class="hljs-string">"utf-8"</span>))
fp2.seek(<span class="hljs-number">0</span>)
print(fp2.read().decode(<span class="hljs-string">"utf-8"</span>))
fp2.close()