Python 文件 I/O
Python 使用一种叫做文件句柄类型的变量来操作文件
从文件读取或者写入数据需要使用文件句柄
文件句柄 (file handle) 是一个 I/O 连接的名称
Python 内置了丰富的函数用来创建,读写,管理和删除文件
本章节我们就来学习一下这些函数
输出到屏幕 - print 语句
print() 语句是我们最常用到的文件 I/O 语句
print() 语句用于将数据输出到标准输出 ( 屏幕 )
可以给它传递零个或多个用逗号隔开的表达式,他会把传递的表达式转换成一个字符串表达式,并将结果写到标准输出
#!/usr/bin/python # -*- coding: UTF-8 -*- print ('人生苦短,我用 Python') print "Python 是一个非常棒的语言,不是吗?";
这时我们就可以在屏幕上看到如下结果
人生苦短,我用 Python Python 是一个非常棒的语言,不是吗?
读取键盘输入 - raw_input() / input() 函数
Python 内置了 raw_input() 和 input() 两个函数用于从标准输入读入一行文本
默认的标准输入是键盘
raw_input() 函数
raw_input([prompt])
函数从标准输入读取一个行,并返回一个字符串 ( 去掉结尾的换行符 )
#!/usr/bin/python # -*- coding: UTF-8 -*- str = raw_input("请输入:"); print "你输入的内容是: ", str
prompt 是用于提示用户的语句
运行以上 Python 代码,它会我们输入任意字符串,然后在屏幕上显示相同的字符串
当我们输入 "Hello Python!" 时,它会输出如下信息
请输入:Hello Python! 你输入的内容是: Hello Python!
input() 函数
input([prompt]) 函数和 raw_input([prompt]) 函数类似,但是 input() 可以接收一个 Python 表达式作为输入,并将运算结果返回
#!/usr/bin/python # -*- coding: UTF-8 -*- str = input("请输入:"); print "你输入的内容是: ", str
运行以上 Python 代码,会产生如下对应着输入的结果
请输入:[x*5 for x in range(2,10,2)] 你输入的内容是: [10, 20, 30, 40]
打开和关闭文件
上面,我们已经学习了如何使用 print() 、raw_input() 、input() 三个函数读写标准输入输出
接下来我们学习如何读写文件
Python 内置了 file() 和 open() 两个函数用来打开一个文件进行读写
open() 函数
open() 函数会会打开一个文件,创建一个 file 对象,返回一个文件句柄
然后相关的方法就可以使用文件句柄来读写打开的文件了
file_object = open(file_name [, access_mode][, buffering])
参数说明
参数 | 说明 |
---|---|
name | 一个包含了你要访问的文件名称的字符串值 |
mode | mode 决定了打开文件的模式:只读,写入,追加等 所有可取值见如下的完全列表 这个参数是非强制的,默认文件访问模式为只读 (r) |
buffering | 如果 buffering 的值被设为 0,就不会有缓冲 如果 buffering 的值取 1,访问文件时会缓冲 如果将 buffering 的值设为大于 1 的整数,就是缓冲区的大小 如果取负值,缓冲区的大小则为系统默认 |
下表列出了打开文件的不同模式 ( mode 参数 )
模式 | 描述 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写 |
File 对象的属性
当我们拥有了一个文件对象的句柄后,我们就可以得到有关该文件的各种信息
下表列出了 file 对象相关的所有属性
属性 | 描述 |
---|---|
file.closed | 返回 True 如果文件已被关闭,否则返回 False |
file.mode | 返回被打开文件的访问模式 |
file.name | 返回文件的名称 |
file.softspace | 如果用 print 输出后,是否同时输出一个空格符,是则返回 True,否则返回 False 。默认为 False |
下面的代码输出了一个文件对象的属性
#!/usr/bin/python # -*- coding: UTF-8 -*- # 打开一个文件 fp = open("demo.txt", "wb") print "文件名: ", fp.name print "是否已关闭 : ", fp.closed print "访问模式 : ", fp.mode print "末尾是否强制加空格 : ", fp.softspace
运行以上 Python 代码,输出结果如下 以上实例输出结果:
文件名: demo.txt
是否已关闭 : False
访问模式 : wb
末尾是否强制加空格 : 0
close() 方法
File 对象的 close() 方法用于刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入
当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件
读写完文件就用 close() 方法关闭文件是一个良好的编程习惯
语法
fileObject.close();
下面的代码演示了 fp.close() 方法的使用 例子:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 打开一个文件 fp = open("demo.txt", "wb") print "文件名: ", fp.name # 关闭打开的文件 fp.close()
运行以上 Python 代码,输出结果如下
文件名: demo.txt
读写文件
file 对象提供了一系列方法,可以让我们轻松简单对文件进行读写
其中最重要的两个方法就是: read() 和 write()
write() 方法
write() 方法用于将任何 Python 字符串写入一个打开的文件
Python 字符串可以是二进制数据,而不是仅仅是文字
需要注意的是:write() 方法不会在字符串的结尾添加换行符 ('\n')
fileObject.write(string);
参数 string
就是要写入到已打开文件的内容
下面的代码使用 write() 方法将 www.twle.cn\nHello
写入文件 demo.txt
中
例子:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 打开一个文件 fo = open("demo.txt", "wb") fp.write( "www.twle.cn\nHello"); # 关闭打开的文件 fp.close()
运行以上 Python 代码,打开 demo.txt 文件可以看到如下内容
$ cat demo.txt www.twle.cn Hello
read() 方法
read() 方法从一个打开的文件中读取一个字符串
读取的内容可以是文本内容,也可以是二进制输出,这取决于原本文件内容的存储格式
fileObject.read([count]);
参数 count
用于设置要从已打开文件中读取的字节计数
read() 方法会从当前的文件指针 ( 刚打开的文件就是从头开始 ) 开始读入
如果没有传入count,它会尝试尽可能多地读取更多的内容,很可能是直到文件的末尾
范例
假设存在文件 demo.txt
文件内容如下
www.twle.cn Hello
下面的代码从 demo.txt
文件中读取 12 个字节的内容
#!/usr/bin/python # -*- coding: UTF-8 -*- # 打开一个文件 fp = open("demo.txt", "r+") str = fp.read(12); print "读取的字符串是 : ", str # 关闭打开的文件 fp.close()
运行以上 Python 代码,输出结果如下
读取的字符串是 : www.twle.cn
文件定位
文件游标
文件游标就是当前文件读到哪里或写到哪里了,比如下图
文件游标类似于我们看到的光标
比如上图中文件游标就是 6 (游标从 0 开始 )
tell() 方法
tell() 方法用于显示当前文件对象的游标的位置
换句话说,下一次的读写会发生在文件开头这么多字节之后
fileObject.tell()
seek() 方法
seek() 方法用于改变当前文件的游标位置
seek ( offset [,from] )
参数 offset
变量用于设置要移动的字节数
参数 from
用于设置开始移动字节的参考位置
- 如果 from 被设为 0,这意味着将文件的开头作为移动字节的参考位置
- 如果设为 1,则使用当前的位置作为参考位置
- 如果它被设为 2,那么该文件的末尾将作为参考位置
范例
假设存在文件 demo.txt
文件内容如下
www.twle.cn Hello
下面的代码演示了 tell() 和 seek() 两个方法的使用
#!/usr/bin/python # -*- coding: UTF-8 -*- # 打开一个文件 fp = open("demo.txt", "r+") str = fp.read(10); print "读取的字符串是 : ", str # 查找当前位置 position = fp.tell(); print "当前文件位置 : ", position # 把指针再次重新定位到文件开头 position = fp.seek(0, 0); str = fp.read(10); print "重新读取字符串 : ", str # 关闭打开的文件 fp.close()
运行以上 Pyhton 代码,输出结果如下
读取的字符串是 : www.twle.c
当前文件位置 : 10
重新读取字符串 : www.twle.c
重命名和删除文件
Python 的 os 模块提供了针对系统文件的处理方法,比如重命名和删除文件
导入 os 模块
要使用这个模块,就必须先导入它,然后才可以调用相关的各种功能
import os
os.rename() 方法
os.rename() 用于重命名一个文件
os.rename(current_file_name, new_file_name)
参数 current_file_name
和 new_file_name
分别表示当前的文件名和新文件名
下面的代码将一个已经存在的文件 demo1.txt
重命名为 demo2.txt
#!/usr/bin/python # -*- coding: UTF-8 -*- import os # 重命名文件 demo1.txt 到 demo2.txt os.rename( "demo1.txt", "demo2.txt" )
remove()方法
os.remove() 方法用于删除一个文件
os.remove(filename)
参数 filename
为要删除的文件路径
下面的代码使用 os.remove() 方法删除当前目录下的 demo2.txt
文件
#!/usr/bin/python # -*- coding: UTF-8 -*- import os # 删除一个已经存在的文件 demo2.txt os.remove("demo2.txt")
Python 目录 I/O
所有文件都包含在各个不同的目录下
Python 在 os
模块里提供了操作目录的各种函数,包括创建,删除和更改目录
mkdir()方法
os.mkdir() 方法用于创建一个新的目录
os.mkdir( newdir )
如果参数 newdir
是相对路径,那么将相对于当前目录创建新的目录
下面的代码使用 os.mkdir() 在当前目录下创建一个新的目录 newdir
#!/usr/bin/python # -*- coding: UTF-8 -*- import os # 创建目录 newdir os.mkdir("newdir")
chdir() 方法
os.chdir() 方法用于更改当前的工作目录
唯一的参数就是想设成工作目录的目录名称
os.chdir( destdir )
下面的代码将当前工作目录更改为上面创建的 newdir
目录下
#!/usr/bin/python # -*- coding: UTF-8 -*- import os # 将当前目录改为 "newdir" os.chdir("newdir")
getcwd() 方法
os.getcwd() 方法用于显示当前的工作目录
os.getcwd()
下面的代码输出当前的工作目录
#!/usr/bin/python # -*- coding: UTF-8 -*- import os # 给出当前的目录 print os.getcwd()
rmdir() 方法
os.rmdir() 方法用于删除一个目录
os.rmdir('dirname')
唯一的参数就是想要删除的目录路径
如果给出目录路径是相对路径,那么会在当前目录下搜索该目录
注意: 在删除这个目录之前,它的所有内容 (文件) 应该先被清除
下面的代码用户删除上面创建的 newdir
目录
#!/usr/bin/python # -*- coding: UTF-8 -*- import os # 删除 "newdir" 目录 os.rmdir( "newdir" )
Python 文件/目录相关的方法
-
file 对象提供了操作文件的一系列方法
-
提供了处理文件及目录的一系列方法