前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 对文件的IO操作

Python 对文件的IO操作

作者头像
星哥玩云
发布2022-09-08 14:10:27
3450
发布2022-09-08 14:10:27
举报
文章被收录于专栏:开源部署

一、读操作

1、读文件

过程

a、找到文件

b、打开文件

c、读取文件的内容 d、关闭文件

找到文件

绝对路径:从根目录开始链接的路径

相对路径:不是从根目录开始链接的路径

代码语言:javascript
复制
path = <span class="hljs-string">r"file.txt"</span>

打开文件

原型

代码语言:javascript
复制
<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+

打开一个文件用于读写,如果该文件存在,文件描述符会被放到文件的末尾,如果文件不存在则会创建该文件

打开

打开普通文件

代码语言:javascript
复制
fp = open(path, <span class="hljs-string">"r"</span>)

打开二进制文件

代码语言:javascript
复制
fp = open(path, <span class="hljs-string">"rb"</span>)

指定编码格式

代码语言:javascript
复制
fp = open(path, <span class="hljs-string">"r"</span>, encoding=<span class="hljs-string">"utf-8"</span>)

指定错误处理方式

代码语言:javascript
复制
fp = open(path, <span class="hljs-string">"r"</span>, encoding=<span class="hljs-string">"utf-8"</span>, errors=<span class="hljs-string">"ignore"</span>)

读取文件的内容

读取文件的全部内容

代码语言:javascript
复制
str1 = fp.read()
print(str1)

读取指定字节数的内容

代码语言:javascript
复制
str2 = fp.read(<span class="hljs-number">4</span>)
print(str2)

读取整行内容(包括\n字符)

代码语言:javascript
复制
str3 = fp.readline()
print(<span class="hljs-string">"*"</span>+str3+<span class="hljs-string">"*"</span>)

读取指定字节数内容

代码语言:javascript
复制
str4 = fp.readline(<span class="hljs-number">13</span>)
print(<span class="hljs-string">"*"</span>+str4+<span class="hljs-string">"*"</span>)

读取所有行并返回一个列表,列表中的元素是每行内容

代码语言:javascript
复制
list5 = fp.readlines()
print(list5)

修改文件描述符的位置

代码语言:javascript
复制
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>)

关闭文件

注意

文件使用过后必须关闭

原因

释放资源,系统能打开的文件个数是有限制的,所以需要释放相应文件的文件描述符

关闭方式

程序结束自动关闭:程序结束时会释放文件对象的空间,文件会关闭,但是不建议这样来做,最好手动关闭

示例

代码语言:javascript
复制
fp.close()

2、读文件完整过程

代码语言:javascript
复制
<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()

3、读文件简写方式

代码语言:javascript
复制
<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())

二、写操作

1、写文件

过程

  • 找到文件
  • 打开文件
  • 将内容写入缓冲区,此时内容没有写入文件
  • 刷新缓冲区,直接把缓存区中的数据立刻写入文件
  • 关闭文件

刷新缓冲区方式

  • 程序结束
  • 关闭文件
  • 手动刷新
  • 缓冲区满了
  • 遇到\n

找打文件

代码语言:javascript
复制
path = <span class="hljs-string">"file.txt"</span>

打开文件

代码语言:javascript
复制
fp = open(path, <span class="hljs-string">"w"</span>)

将内容写入缓冲区

代码语言:javascript
复制
fp.write(<span class="hljs-string">"sunck good"</span>)

手动刷新缓冲区

代码语言:javascript
复制
fp.flush()

关闭文件

代码语言:javascript
复制
fp.close()

2、写文件完整过程

代码语言:javascript
复制
<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()

3、写文件简写方式

代码语言:javascript
复制
<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>)

三、编码与解码

1、编码

代码语言:javascript
复制
<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)

2、解码

代码语言:javascript
复制
<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)

3、chardet模块

作用

使用chardet检测编码,支持检测中文、日文、韩文等多种语言

安装

pip install chardet

使用

代码语言:javascript
复制
<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)

四、特殊的读写

1、list、tuple、dict、set的文件操作

pickle模块

持久化保存对象,将list、tuple、dict、set等数据序列化存储到文件

代码语言:javascript
复制
<span class="hljs-keyword">import</span> pickle

存储

代码语言:javascript
复制
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)

读取

代码语言:javascript
复制
<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))

2、StringIO

作用

数据的读写不一定都是文件,也可以是内存中读写,StringIO可以在内存中读写字符串

导入

代码语言:javascript
复制
<span class="hljs-keyword">from</span> io <span class="hljs-keyword">import</span> StringIO

代码语言:javascript
复制
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())

代码语言:javascript
复制
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())

注意:文件使用后关闭文件

3、BytesIO

作用

数据的读写不一定都是文件,也可以是内存中读写,StringIO只能操作字符串,BytesIO可以操作二进制数据

使用

代码语言:javascript
复制
<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()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、读操作
    • 1、读文件
      • 2、读文件完整过程
        • 3、读文件简写方式
        • 二、写操作
          • 1、写文件
            • 2、写文件完整过程
              • 3、写文件简写方式
              • 三、编码与解码
                • 1、编码
                  • 2、解码
                    • 3、chardet模块
                    • 四、特殊的读写
                      • 1、list、tuple、dict、set的文件操作
                        • 2、StringIO
                          • 3、BytesIO
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档