{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## open函数\n", "\n", "\n", "Python的`open`函数用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出`OSError`。\n", "\n", "注意:使用`open`函数一定要保证关闭文件对象,即使用完文件对象`f`后,一定要调用`close`函数。\n", "\n", "open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。\n", "\n", "基本用法为`file_object = open(file, mode)`\n", "\n", " - `file`是参数必需指定,表示文件路径(**相对**或者**绝对**路径);\n", " - `mode`是可选参数,表示文件打开模式,默认取值为r,表示只读模式。" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# 指定windows平台下Python运行时的默认编码类型为UTF-8\n", "import _locale\n", "_locale._getdefaultlocale = (lambda *args: ['zh_CN', 'utf8'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "拓展学习:\n", "\n", "从根本解决python3 open的UnicodeDecodeError: 'gbk' codec问题\n", "\n", "解决Python在windows平台默认编码(encoding)为gbk所导致的open()函数报错及其他编码问题" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# 打开和该jupyter notebook在同一文件夹下的文本文件,r表示以只读方式打开\n", "f = open('./text.txt','r')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# 将文件中的内容全部读取并保存到变量content中\n", "content = f.read()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# 将文件对象关闭\n", "f.close()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "str" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 查看content的类型\n", "type(content)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "从明天起,做一个幸福的人\n", "喂马、劈柴、周游世界\n", "从明天起,关心粮食和蔬菜\n", "我有一所房子,面朝大海,春暖花开\n", "\n", "从明天起,和每一个亲人通信\n", "告诉他们我的幸福\n", "那幸福的闪电告诉我的\n", "我将告诉每一个人\n", "\n", "给\n" ] } ], "source": [ "# 打印输出字符串content的前100个字符\n", "print(content[:100])" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "们我的幸福\n", "那幸福的闪电告诉我的\n", "我将告诉每一个人\n", "\n", "给每一条河每一座山取一个温暖的名字\n", "陌生人,我也为你祝福\n", "愿你有一个灿烂的前程\n", "愿你有情人终成眷属\n", "愿你在尘世获得幸福\n", "我只愿面朝大海,春暖花开\n", "\n" ] } ], "source": [ "# 打印输出字符串content的后100个字符\n", "print(content[-100:])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**文件路径名**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**绝对路径名**:是从盘符开始直到文件本身的文件名。\n", "\n", "例如,Windows操作系统下:\n", "\n", "```\n", "D:\\programming_basics\\index.html\n", "D:\\anaconda3\\LICENSE.txt\n", "```\n", "\n", "例如,Linux操作系统下:\n", "\n", "```\n", "/home/zjz/programming_basics/index.html\n", "/usr/local/anaconda3/LICENSE.txt\n", "```\n", "\n", "Mac操作系统与Linux操作系统类似。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**相对路径名**:是从**当前目录**到文件本身的文件名。例如,当前目录是`lecture_9`,要打开的文件是这个目录下`lecture_9.ipynb`,则相对路径文件名就是`lecture_9.ipynb`。\n", "\n", "在表示相对路径时,`.`可以表示当前目录名,`..`可以表示当前目录的上一级目录名。\n", "\n", "例如,下面是`codes`文件夹的目录树,假如当前文件夹为`lecture_9`:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```\n", "├── lecture_1\n", "│ ├── BMI_calculation.ipynb\n", "│ ├── BMI_calculation.py\n", "│ ├── imgs\n", "│ │ ├── bit_byte.jpg\n", "│ │ ├── maiyouweng.jpg\n", "│ │ ├── while.gif\n", "│ │ └── while.jpg\n", "│ └── lecture_1.ipynb\n", "├── lecture_2\n", "│ └── lecture_2.ipynb\n", "└── lecture_9\n", " ├── poems.txt\n", " ├── lyrics.txt\n", " └── lecture_9.ipynb\n", "\n", "4 directories, 11 files\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "文件`lecture_9.ipynb`的相对路径可以表示为`./lecture_9.ipynb`(Linux和Mac中)或者`.\\lecture_9.ipynb`(Windows中)。\n", "\n", "文件`lecture_2.ipynb`的相对路径可以表示为`../lecture_2/lecture_2.ipynb`(Linux和Mac中)或者`..\\lecture_2\\lecture_2.ipynb`(Windows中)。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "思考题:根据上面的`codes`文件夹的目录树,思考一下,假如当前文件夹为`lecture_2`,文件`bit_byte.jpg`的相对路径如何表示。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**打开模式**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`mode`:表示打开文件的访问模式,常用的模式有只读`r`、写入`w`和追加`a`,其缺省值是只读`r`,更严谨地,其缺省值为`rt`。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "mode参数主要包括两个部分:**读写模式**,**文件格式**。`mode`参数取值完整列表如下:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
文件格式 | 描述 |
---|---|
t | 文本模式 (默认)。 |
b | 二进制模式。 |
读写模式 | 描述 |
x | 写模式,新建一个文件,如果该文件已存在则会报错。 |
+ | 打开一个文件进行更新(可读可写)。 |
U | 通用换行模式(不推荐)。 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |