人生苦短,我选Python
前文传送门python
小白学 Python(2):基础数据类型(上)github
小白学 Python(9):基础数据结构(列表)(上)spa
在介绍文件操做以前,咱们先介绍两个概念,绝对路径和相对路径。
先百度下看下百度的解释:
不知各位同窗看懂了没,没看懂我再举个栗子给各位加深下理解。
好比咱们要描述 Demo.py
的绝对路径,那么就是: F:/project/python-learning/base-data-def/Demo.py
。
相对路径是描述当前位置相对于目标位置的路径,好比当前咱们存在的路径是 F:/project/python-learning/
,咱们仍是要描述上面的那个 Demo.py
,那么它的相对路径是 ./base-data-def/Demo.py
。
Python 为咱们提供了打开文件的内置函数 open()
。
经常使用语法:
open(file, mode='r')
完整语法:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明:
mode 参数经常使用值:
模式 | 描述 |
---|---|
t |
文本模式 (默认)。 |
x |
写模式,新建一个文件,若是该文件已存在则会报错。 |
b |
二进制模式。 |
+ |
打开一个文件进行更新(可读可写)。 |
r |
以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb |
以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。通常用于非文本文件如图片等。 |
r+ |
打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ |
以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。通常用于非文本文件如图片等。 |
w |
打开一个文件只用于写入。若是该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。若是该文件不存在,建立新文件。 |
wb |
以二进制格式打开一个文件只用于写入。若是该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。若是该文件不存在,建立新文件。通常用于非文本文件如图片等。 |
w+ |
打开一个文件用于读写。若是该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。若是该文件不存在,建立新文件。 |
wb+ |
以二进制格式打开一个文件用于读写。若是该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。若是该文件不存在,建立新文件。通常用于非文本文件如图片等。 |
a |
打开一个文件用于追加。若是该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容以后。若是该文件不存在,建立新文件进行写入。 |
ab |
以二进制格式打开一个文件用于追加。若是该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容以后。若是该文件不存在,建立新文件进行写入。 |
a+ |
打开一个文件用于读写。若是该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。若是该文件不存在,建立新文件用于读写。 |
ab+ |
以二进制格式打开一个文件用于追加。若是该文件已存在,文件指针将会放在文件的结尾。若是该文件不存在,建立新文件用于读写。 |
光说不练假把式,下面开启咱们第一个示例:
str1 = open('F:/project/python-learning/base-data-def/Demo.py', mode='r').read() print(str1)
打印结果我就不贴出来了,正常打印了咱们前几篇文章的示例代码。
根据编码格式的不一样,能够将文件分为文本字符和二进制字节。
咱们平常看到的都是文本字符,可是文本字符在保存计算机的时候都会转变成二进制字节,这时候,就要考虑到编码的问题了。
咱们看下转换的示例图:
值得注意的是,在 Python3 中,文件默认的编码方式是 UTF-8 ,文本字符的经常使用的编码有 ASCII 和 Unicode 。
说了这么多,仍是看一个示例代码吧:
str2 = '好好学习,每天向上' print(type(str2)) a = str2.encode('utf-8') print(type(a)) print(a.decode('utf-8'))
打印结果以下:
<class 'str'> <class 'bytes'> 好好学习,每天向上
能够看到,咱们将字符串 encode()
编码之后,类型变成了 byte
。
若是咱们使用编码 gbk
的方式解码上面的 a 会怎么样呢?
print(a.decode('gbk'))
结果以下:
Traceback (most recent call last): File "F:/project/python-learning/base-file/Demo.py", line 10, in <module> print(a.decode('gbk')) UnicodeDecodeError: 'gbk' codec can't decode byte 0x8a in position 26: incomplete multibyte sequence
告诉咱们不能使用 gbk
来进行解码操做。
这个其实很好理解,比如咱们将中文翻译成为了英文(编码),而后咱们经过日文翻译想要将英文翻译回中文(解码),那么这个日文翻译确定会骂你脑子有病。
前面咱们介绍了经过内置函数来操做文件,咱们还能够经过 OS 模块更简单的l哎操做文件。
OS 模块是和操做系统相关的模块。
为了演示,先创建一个 test.txt
文件。
首先,咱们打开这个文件:
import os os.chdir('F:/project') file = open('test.txt')
读取这个文件并打印:
print(file.read())
结果以下:
微信公众号:极客挖掘机
而后咱们在下面再加一些内容:
file.write('关注公众号,好好学习,每天向上')
而后发现执行报错了:
Traceback (most recent call last): File "F:/project/python-learning/base-file/Demo.py", line 17, in <module> file.write('关注公众号,好好学习,每天向上') io.UnsupportedOperation: not writable
从报错信息能够看出,是咱们当前读取权限的问题,由于咱们读取时是只读权限,没法写入,因此稍微修改下上面读取文件的代码:
import os os.chdir('F:/project') file = open('test.txt', mode='a+') file.write(' \n 关注公众号,好好学习,每天向上')
执行完成后咱们再看下咱们的测试文件:
写入成功。
咱们测试一个有意思的事情,若是同一个文件咱们读取两次会怎么样?
import os os.chdir('F:/project') file = open('test.txt') print(file.read()) print(file.read())
打印结果以下:
微信公众号:极客挖掘机 关注公众号,好好学习,每天向上
咱们明明在代码中打印了两次,为何只显示了一次呢?
由于 read()
读取全部内容,读取完后,游标是指在最后的,再日后读取确定就读不到内容了。
好了,本篇的内容就到此为止了,但愿各位同窗能动手练习下示例代码。
本系列的全部代码小编都会放在代码管理仓库 Github 和 Gitee 上,方便你们取用。
若是个人文章对您有帮助,请扫码关注下做者的公众号:获取最新干货推送:)