有时候 我们可能需要记录一些程序中的数据,以及要保存一些中间结果,这个时候我们就要把 数据存起来。 一般 情况 是存放在数据库里面,mysql ,redis ,mongodb ,postgresql 等等。 还有的时候 我们 把数据 保存在 文件里面,今天 主要的话题,讨论 如何 使用文件 保存数据, 读写文件相关的操作。
在python 打开 文件 非常方便。 open
就可以打开文件,然后就开始读了。
# -*- coding: utf-8 -*-
f = open('hello.txt')
content = f.read()
print(content)
f.close()
open 就会打开文件, 返回一个 TextIOWrapper 对象 , 然后 调用 read 就可以读取 文件里面的数据了, 读完之后 记得 要关闭文件哦。
当你使用完一个文件时,调用 f.close()
方法就可以关闭它并释放其占用的所有系统资源。 当你 关闭 文件后,就不能再次读取了,除非 在一次 打开它。
如果确定打开的文件不用的话 ,要及时关闭哦。
打开 文件的方式 有很多种,
如果尝试打开一个不存在的文件会报错的。下面的例子 就会报错 FileNotFoundError
f = open('hello1.txt')
Traceback (most recent call last):
File "C:/Users/changfx/PycharmProjects/python-study/myfile.py", line 4, in <module>
f = open('hello1.txt')
FileNotFoundError: [Errno 2] No such file or directory: 'hello1.txt'
从上面的例子中,可以知道 文件读写 也有可能发生一些错误。 我们 如何能够打开一个文件 ,如果不存在,我们就创建它,存在 就打开它呢?
这个 就要说一下,打开 文件的正确姿势。 我打开文件 是为了读,还是为了写, 对于 open
有一个参数
mode 这里可以是读,或者写。
mode =‘r’ 代表 读
mode =‘w’ 代表写
f = open('hello.txt',mode='r')
f = open('hello.txt',mode='w')
如何读取文件呢? 刚刚的例子,也看到了,可以用 f.read() 去读取文件内容。
f = open('hello.txt',mode='r')
content = f.read()
print(content)
f.close()
"""
1111
2222
3333
"""
一般情况 我们很少使用f.read()
因为 read() 默认是读取文件的全部内容。 如果文件比较大, 电脑会直接卡死的,占用大量内存。
我们可以使用 f.readline()
这个方法名,起的非常好,直接就能够理解 这是一行一行读取文件内容。
f = open('hello.txt',mode='r')
content = f.readline()
while content:
print(content)
content = f.readline()
f.close()
看下 readline 会把换行符也会读进来。
f.readline()
从文件中读取单独一行,字符串结尾会自动加上一个换行符( \n
),只有当文件最后一行没有以换行符结尾时,这一操作才会被忽略。这样返回值就不会有混淆,如果 f.readline()
返回一个空字符串,那就表示到达了文件末尾,如果是一个空行,就会描述为 '\n'
,一个只包含换行符的字符串
还有一个方法 f.readlines()
它返回的是以行为单位的列表,包括换行符的, 这个相当于是 f.readline() 读完每行后,存放在一个列表中 进行返回。
如何写文件,首先打开文件方式 mode =‘w’ ,才能开始写文件。
开始尝试写 入文件 f.write()
写入文件
f = open('hello.txt',mode='w')
f.writelines("Beautiful is better than ugly.\n")
f.writelines('Explicit is better than implicit.\n')
f.writelines('Simple is better than complex.\n')
f.close()
执行上的代码,然后看下 hello.txt 文件
发现 之前写的 111,222,333 , 不见了。 这种默认 mode=w 的方式,就会覆盖文件内容,重新写入文件。
如果要实现 追加写入的话 mode =‘a+’
打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
f = open('hello.txt',mode='a+')
# \n 代表是换行的意思,要自己换行,否则写在一行上了。
f.write("Beautiful is better than ugly.\n")
f.write('Explicit is better than implicit.\n')
f.write('Simple is better than complex.\n')
# 关闭打开的文件
f.close()
写入文件,还可以使用 f.writelines()
这里可以传入一个list 进行写入,用法类似
f = open('hello.txt',mode='w')
contents = ["Beautiful is better than ugly.\n",
"Explicit is better than implicit.\n",
"Simple is better than complex.\n",
"Complex is better than complicated.\n",
"Flat is better than nested.\n"]
f.writelines(contents)
# 关闭打开的文件
f.close()
对于这个f 还有一些 其他的方法,比如 获取当前的位置,移动位置,查看文件描述符等。
file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数:
序号 | 方法及描述 |
---|---|
1 | file.close()关闭文件。关闭后文件不能再进行读写操作。 |
2 | file.flush()刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
3 | file.fileno()返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 |
4 | file.isatty()如果文件连接到一个终端设备返回 True,否则返回 False。 |
6 | [file.read(size])从文件读取指定的字节数,如果未给定或为负则读取所有。 |
7 | [file.readline(size])读取整行,包括 “\n” 字符。 |
8 | [file.readlines(sizeint])读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。 |
9 | [file.seek(offset, whence])移动文件读取指针到指定位置 |
10 | file.tell()返回文件当前位置。 |
11 | [file.truncate(size])从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 windows 系统下的换行代表2个字符大小。 |
12 | file.write(str)将字符串写入文件,返回的是写入的字符长度。 |
13 | file.writelines(sequence)向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。 |
mode 有很多种 还可以组合 。
mode : 最常用的 就是 r 只读 , w 写入。
还有 t b , t就是 文本模式, b 就是二进制模式,打开一个二进制文件,就要用这个。
如果追加写入文件 mode =a+ , 这样是追加写入。
模式 | 描述 |
---|---|
t | 文本模式 (默认)。 |
x | 写模式,新建一个文件,如果该文件已存在则会报错。 |
b | 二进制模式。 |
+ | 打开一个文件进行更新(可读可写)。 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
r+ vs w+ 区别
r+
:可读可写,若文件不存在,报错 ;w+: 可读可写,若文件不存在,创建。
这两个文件的指针 都会在文件的开始位置
模式 | 可做操作 | 若文件不存在 | 是否覆盖 |
---|---|---|---|
r+ | 读,写 | 报错 | 是 |
w+ | 读写 | 创建一个文件 | 是 |
关于 有没有 + 号 的区别 ?
模式 | 可做操作 | 若文件不存在 | 是否覆盖 |
---|---|---|---|
r | 只能读 | 报错 | - |
r+ | 可读可写 | 报错 | 是 |
w | 只能写 | 创建 | 是 |
w+ | 可读可写 | 创建 | 是 |
a | 只能写 | 创建 | 否,追加写 |
a+ | 可读可写 | 创建 | 否,追加写 |
正确 打开文件的姿势 ,with 语句 打开文件 不需要 显示的关闭文件, with 语句,已经帮助我们 关闭了文件。
当我们退出 with 语句的时候,就会关闭文件.
with open('hello.txt','w') as f:
f.write("hello Frank")
print("f.write done.")
大部分情况下,我们更喜欢 用这种方式 打开文件,因为这样看起来更加优雅,再也不用担心 忘记关闭文件了。
pep 是 Python Enhancement Proposals
的缩写 ,翻译过来 就是 python增强建议。就是一些人对python 发展 提出的一些建议, 如果建议被采纳了,将来就会增加这个功能。
比如pep8 文档 ,Style Guide for Python Code 就是python的一些风格规范,作为python开发工程师,这还是要了解一些,这个文档主要讲了 一些命名规范,对齐风格,最大的行的长度等等。
如果英文不是特别好,我准备了一个翻译的版本,你可以参考一下。 python3中风格规范
今天 我们 学习了 如何 使用文件来保存数据,如何 打开文件,写入数据。 其实 大部分工作的情况下,很少写入文件,因为大部分时候需要我们把数据保存到 数据库里面。随着 代码量的增加,对python的认识的深入 ,有的时候 需要一种代码规范 来 保证我们 代码看起来更加的专业。 所以 我推荐 你看下 pep8 文档。参考文档中 给出了 pep 文档的地址, 以及pep8 文档地址,有时间 要好好读一下。 好的,今天 的内容不算多,大部分的内容需要去读,然后跟着去练习。 加油!
Input and Output-官方文档
文件操作-零基础学python
输入和输出 pythondoc
Python3 输入和输出-runoob
pep index
pep-0008