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

Python3之文件操作file

作者头像
py3study
发布2020-01-09 10:36:35
8280
发布2020-01-09 10:36:35
举报
文章被收录于专栏:python3python3

文件file

什么是文件:
  • 文件是用于数据存储的单位
  • 文件通常用来长期存储数据
  • 文件中的数据是以字节为单位进行存储的
文件的操作流程:
  1. 打开文件
  2. 读/写文件
  3. 关闭文件 注意:任何操作系统,一个应用程序同时打开文件的数量有最大数限制 文件一般流程:
代码语言:javascript
复制
f = open(filename, 'xxx')  # 打开文件
'''这里是读写操作'''
f.close()  # 关闭文件

mode模块字符的含义:

字符

含义

‘r’

以只读方式打开(默认)

‘w’

以只写方式打开,删除原有文件内容(如果文件不存在,则创建该文件并以只写方式打开)

‘x’

创建一个新文件, 并以写模式打开这个文件,如果文件存在则会产生”FileExistsError”错误

‘a’

以只写文件打开一个文件,如果有原文件则追加到文件末尾

‘b’

用二进制模式打开

‘t’

文本文件模式打开 (默认)

‘+’

为更新内容打开一个磁盘文件 (可读可写)

- 默认是’rt’ - ‘w+b’ 可以实现二进制随机读写,当文件打开时,文件内容被清空 - ‘r+b’ 以二进制读和更新模式打开文件,打开文件时不会清空文件内容 - ‘r+’ 以文本模式读和更新模式打开文件,打开文件时不会清空文件内容

python在文件常用的方法:

方法

说明

F.close()

关闭文件(关闭后文件不能再读写会发生ValueError错误)

F.readline()

读取一行数据, 如果到达文件尾则返回空行

F.readlines(max_chars=-1)

返回每行字符串的列表,max_chars为最大字符(或字节)数

F.writelines(lines)

将字符串的列表或字符串的列表中的内容写入文件

二进制文件操作方法

F.read(size=-1)

从一个文件流中最多读取size个字符(文本文件)或字节(二进制文件),如果不给出参数,则默认读取文件中全部的内容并返回

F.write(text)

写一个字符串到文件流中,返回写入的字符数(文本文件)或字节数(二进制文件)

F.tell()

返回当前文件流读写指针的绝对位置(字节为单位)

F.seek(offset, whence=0)

改变数据流读写指针的位置,返回新的绝对位置

F.flush()

把写入文件对象的缓存内容写入到磁盘

文件的读操作:

read:读取文件的全部内容并原样输出

如,当前有文件myfile.txt:

这里写图片描述
这里写图片描述
代码语言:javascript
复制
f = open('myfile.txt')
res = f.read()
print(res)
f.close()

输出结果是:

这里写图片描述
这里写图片描述
代码语言:javascript
复制
f = open('myfile.txt')
res = f.read(3)
print(res)
f.close()

read可以设置读取字符数: 如:

代码语言:javascript
复制
f = open('myfile.txt')
res = f.read(3)
print(res)
f.close()

打印结果:

代码语言:javascript
复制
你好!
readline:读取文件的一行内容,以换行符 ’ \n ’ 分割

还是以上文件myfile.txt

代码语言:javascript
复制
f = open('myfile.txt')
res = f.readline()
print(res)
f.close()

输出结果:

代码语言:javascript
复制
/usr/bin/python3.5 /home/.../myfile.py
你好! 我在文件里
readlines:读取文件的全部内容,以换行符 ’ \n ’ 分割存在列表中

还是以上文件myfile.txt

代码语言:javascript
复制
f = open('myfile.txt')
res = f.readlines()
print(res)
f.close()

输出结果:

代码语言:javascript
复制
/usr/bin/python3.5 /home/.../myfile.py
['你好! 我在文件里\n', '你好! 我在文件里\n', '你好! 我在文件里\n', '你好! 我在文件里 gh\n', '\n', '你好! 我在文件里\n']

以readlines读取的文件内容是可迭代对象,可以使用for循环遍历,或直接示意索引下标获取想要的内容

文件的二进制读取:

现在改了myfile的内容如下: 你好! aaa

现在以二进制的形式将这两行文字读取出来

代码语言:javascript
复制
f = open('myfile.txt', 'rb')  # 打开方式使用'rb'
res = f.read()
print(res)
f.close()

结果是:

代码语言:javascript
复制
b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x81\naaa\n'

文件的写操作

write (text) : 将字符串写入到文件当中
代码语言:javascript
复制
f = open('newfile.txt', 'w')  # w :有则打开并覆盖原内容,没有则新建文件
s = 'dfjhg\nhdgf'  # \n 会被解析成换行符
f.write(s)
f.close()

文件内容:

代码语言:javascript
复制
dfjhg
hdgf
writelines:将列表或列表的内容写入到文件(只能是字符串)
代码语言:javascript
复制
f = open('newfile.txt', 'w') 
L = ['sadf', 'sdf\n', '324\n']  # \n 被解析
f.writelines(L)
f.close()

文件内容:

代码语言:javascript
复制
sadfsdf
324

我们输一个不是字符串类型的试试:

代码语言:javascript
复制
L = ['sadf', 'sdf\n', '324\n', True]  # 把上述列表改成这个

结果出现错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "/home/.../file_write_text.py", line 3, in <module>
    f.writelines(L)
TypeError: write() argument must be str, not bool

错误提示大概是这样的:写的内容必须是字符串类型,而不是布尔类型

以二进制的形式写入文件
代码语言:javascript
复制
f = open('newfile.txt', 'wb')   # 使用 wb
L = [b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x81\naaa\n']  # \n 被解析
f.writelines(L)
f.close()

文件内容:

代码语言:javascript
复制
你好!
aaa

也可以使用write写。

文件的一些其他操作

flush:强制将缓存区的内容写入文件

有时候写着写着文件突然断电等,让写操作断开了,这时没有写完的就会放入缓冲区里,可以使用flush强制写入文件,具体写法如下:

代码语言:javascript
复制
f.write()
f.flush()  # 直接在写后边加这一句话即可
tell:返回当前文件流的读写位置(从0开始,以字节为单位)
代码语言:javascript
复制
try:
    f = open('mynote.txt', 'rt')

    b = f.read(3)
    print(b)
    print('当前的位置是:', f.tell())
    f.close()
except OSError:
    print('打开二进制文件失败')

打印结果:

代码语言:javascript
复制
bbb
当前的位置是: 3
seek:设置文件的读写位置

语法格式:f.seek(偏移量,whence=相对位置) 偏移量:大于0代表向文件尾方向移动,小于0代表向文件头移动 相对位置: 0—–>代表从文件头开始偏移 1—–>代表从文件当前位置开始偏移 2—–>代表从文件尾开始偏移

如有myfile.txt,内容是:abcdeABCDE1234567890

代码语言:javascript
复制
f = open('myfile.txt', 'rb')
b = f.read(3)  # 读取 3 个字符
print(b)

f.seek(5, 0)  # 0 从文件头开始移动,5 表示向尾移动,偏移量大小为 5,即开始从‘A’读
c = f.read(5)  # 读 5 个字符
print(c)

f.seek(2, 1)  # 1 表示从当前位置移动,2 表示向尾移动,偏移量大小为 2 ,即从 ‘3’ 开始读
d = f.read(5)  # 向尾读取 5 个字符
print(d)

f.seek(-15, 2)  # 2 表示从尾开始移动,-15 表示向文件头移动,偏移量大小为 15,即从'A'开始读
e = f.read(5)
print(e)

f.close()

执行结果:

代码语言:javascript
复制
b'abc'
b'ABCDE'
b'34567'
b'ABCDE'

本节完

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文件file
    • mode模块字符的含义:
      • python在文件常用的方法:
        • 文件的读操作:
          • 文件的写操作
            • 文件的一些其他操作
            相关产品与服务
            数据保险箱
            数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档