前言
在实际的编程当中,经常要将一些处理好的数据,写入到特定的文件中,供我们后期的查阅,最常见的就是各种日志文件。
Python 已集成了文件操作的方法,这里只讲解最常使用的一些操作技能,完全操作指南,您可以查看相应的文件。
基本输入/输出(I/O)
在正式开始讲文件操作时,先来讲两个比较重要的操作: 输入(input) 与 输出( output ) 。
输入: 检测键盘的输入,常用于检测用户的数据输入。
输出: 将处理好的数据进行输出,常见的是将数据显示到屏幕上。
Python 提供的输入函数有: input( )
和 raw_input( ) 这两个,但是后者只允许在 Python 2.X 版本中使用。
Python 提供的输出函数有: print( )
标准输入
语法格式:
input( "Hint_information" )
Hint_information:用户输入前的提示信息(可缺省)。
实例如下:
# !/usr/bin/python
# -*- coding: UTF-8 -*-
text = input("请输入:") # 提示用户输入信息
print("用户输入了:", text)
运行程序,此时程序会要求用户输入信息,这里输入: hello world !
实例输出:
请输入:hello world !
用户输入了: hello world !
标准输出
语法格式:
print(*objects, sep=' ', end='\n', file=sys.stdout)
由于经常使用,这里就不在叙述了。
打开/创建文件
在对文件的操作中,Python 已提供了很多基本而又实用的相关函数和方法。通常在操作文件时,都会创建一个文件对象,后面的操作都会使用该对象来进行操作。
Python 提供了 open( )
函数来打开或创建一个文件,基本格式如下:
file_object = open("文件名","访问模式","缓存控制")
参数说明:
- file_object : 创建一个编辑文件的对象。
- 文件名: 要访问/创建的文件名(需跟上后缀名),文件名前可以跟上绝对路径,只填写文件名时,默认使用相对路径。
- 访问模式: 用于控制文件的编辑模式,如:读取、写入、读写....(具体看控制模式表),该参数可缺省,默认为只读( r )模式。
- 缓存控制: 用于控制编辑文件时是否开启文件缓存,缓存空间大小。 具体为:
0: 不缓存
,1: 缓存
,>1: 自定义缓存空间(就是该值的大小)
,<0: 使用系统默认大小的缓存空间
。
以下是 Python 提供的文件编辑模式:
模式 | 权限 | 含义 | 组织形式 |
---|---|---|---|
"r" | (只读)--默认 | 打开已存在文件,用于只读 | 文本文件 |
"w" | (只写) | 创建或重建文件,用于只写 | 文本文件 |
"a" | (追加) | 在文件尾追加数据,若文件不存在则创建只写 | 文本文件 |
"r+" | (可读可写) | 打开已存在文件,用于读/写 | 文本文件 |
"w+" | (可读可写) | 创建或重建文件,用于写/写 | 文本文件 |
"a+" | (可读可写) | 在文件尾追加数据,若文件不存在则创建读/写 | 文本文件 |
"rb" | (只读二进制) | 打开已存在文件,用于只读 | 二进制文件 |
"wb" | (只写二进制) | 创建或重建文件,用于只写 | 二进制文件 |
"ab" | (追加二进制) | 在文件尾追加数据,若文件不存在则创建只写 | 二进制文件 |
"rb+" | (可读可写二进制) | 打开已存在文件,用于读/写 | 二进制文件 |
"wb+" | (可读可写二进制) | 创建或重建文件,用于写/写 | 二进制文件 |
"ab+" | (可读可写二进制) | 在文件尾追加数据,若文件不存在则创建读/写 | 二进制文件 |
常用文件编辑模式一览表:
模式 | r | r+ | w | w+ | a | a+ |
---|---|---|---|---|---|---|
读 | √ | √ | √ | √ | ||
写 | √ | √ | √ | √ | √ | |
创建 | √ | √ | √ | √ | ||
覆盖 | √ | √ | ||||
指针在开始 | √ | √ | √ | √ | ||
指着在结尾 | √ | √ |
关闭文件
Python 提供 close()
的方法,来关闭已经打来了的文件。程序在执行 close()
方法时,会刷新缓冲区里还没有写入文件中的内容,并将该内容写入到文件当中,然后执行文件的关闭操作。文件在关闭后便不能在往里面进行写入、读取等操作。
基本格式:
file_object.close( )
注意:在创建文件对象后,当该对象所指向的文件在未被关闭时,而又重新指向了另外一个文件变量时,前一个文件将会被自动关闭。所以在每次操作完文件后,最好使用 close()
方法进行文件的关闭。
以下是具体的,文件打开、关闭实例:
# !/usr/bin/python
# -*- coding: UTF-8 -*-
fo = open("D:/aa.txt","w+") # 在D盘根目录下创建并打开 aa.txt 文件,权限为:读写模式
fo.close() # 关闭 aa.txt 文件
运行程序:
此时在 D 盘的根目录下,已经创建了一个 aa.txt 的文本文件。
注意:在上面指定的是D盘,你也可以指定其它的目录,在指定目录时,各级目录使用的是 /
分隔符,这要区别于 Windowns 下的 \
,这点应引起注意!当然你也可以不指定目录,这时 Python 使用的就是当前(相对路径)目录了。
读/写文件
Python 为用户提供了一系列的文件操作方法,使用这些方法可以使得我们在操作文时件更加简便、轻松。下面就来看看如何使用 read()
和 write() 方法来读取和写入文件。
write( )方法
write( ) 方法是 Python 提供的一个内容写入方法,使用该方法可以将任意字符串写入一个已经打开了的文件中。
语法格式:
file_object.write( string )
注:write() 方法不会在字符串的结尾添加换行符(\n
)。
实例如下:
# !/usr/bin/python
# -*- coding: UTF-8 -*-
fo = open("D:/aa.txt","w+") # 在D盘根目录下创建并打开 aa.txt 文件,权限为:读写模式
fo.write("Hello World!") # 向文件写入内容" Hello World!"
fo.close() # 关闭 aa.txt 文件
运行实例:
此时,打开D盘下的 aa.txt 文件,其中就会多了一条 Hello World!
的数据。
read( )方法
write( ) 方法是 Python 提供的一个文件内容读取方法,使用该方法可以从已经打开了的文件中读取想要的内容。
语法格式:
file_object.read([count])
参数说明:
count: 为想要读取的内容数量(单位为:字节),如果缺省该参数,Python将会以贪婪模式进行读取,进最大能力读出更多的文件内容。
注意:使用读取或写入方法时,都应注意程序当前的指针位置,这些方法操作的内容都是向后进行读取或写入的。
实例如下:
本实例依赖于前面的 aa.txt 文件,请确保文件中有相关内容。
# !/usr/bin/python
# -*- coding: UTF-8 -*-
fo = open("D:/aa.txt","r+") # 打开D盘下的 aa.txt 文件,权限为:读写模式
str_1 = fo.read( 3 ) # 读取 5 Byte 内容
str_2 = fo.read( ) # 读取指针后面的内容
print( str_1 )
print( str_2 )
fo.close() # 关闭 aa.txt 文件
实例输出:
Hel
lo World!
分析:可见程序在执行第一次 read() 后,指针就位移到了第一个 l
的后面,后面再进行相关的操作时,是以当前的指针位置为起点再进行计算的了。
文件对象属性
当一个文件被程序打开后,也就拥有了一个 file 属性,使用属性可以得到有关该文件的各种信息,属性的出现使得用户可以更好的编辑和管理文件。
Python提供的获取文件对象属性常用方法有:
属性 | 描述 |
---|---|
file_object.name | 返回文件名 |
file_opject.mode | 返回文件编辑的模式 |
file_object.closed | 返回文件当前编辑状态 (True : 文件关闭;False:文件编辑中) |
实例如下:
# !/usr/bin/python
# -*- coding: UTF-8 -*-
fo = open("D:/aa.txt","r+") # 在D盘根目录下创建并打开 aa.txt 文件,权限为:读写模式
print( fo.mode ) # 查看文件打开模式
print( fo.name ) # 查看打开文件的名称(含路径)
print( fo.closed ) # 查看文件是编辑中还是关闭中, 当前处于编辑中
fo.close() # 关闭文件
print( fo.closed ) # 再次查看文件编辑状态
实例输出:
r+
D:/aa.txt
False
True
说明: 文件对象的属性不仅可以在文件编辑当中进行调用,同样可以在文件关闭后,一样可以进行调用,系统反馈回来的都是当前文件对象所拥有的属性。
文件指针
文件指针,即文件当前所在的编辑位置。在编辑文件中,我们经常需要指针所在的位置,然后再进行写入或读取操作。下面就来介绍文件指针的操作。
tell()方法:返回当前编辑文件中,指针所在的位置。 注:该方法只能在文件编辑中使用。
seek(offset [,whence])方法:修改文件指针的位置。
offset:表示要将指针移动的字节数。
whence:指定文件指针移动前的起始参考位置。( 0
:表示将文件的开始处作为移动前参考位置;1
:将当前指针位置作为移动前参考位置; 2
:文件末尾作为移动前参考位置。)
实例如下:
同样使用上面生成的文件,实验前注意文件用有相关内容。
# !/usr/bin/python
# -*- coding: UTF-8 -*-
# 声明:源文件中存在内容"Hello World!"
fo = open("D:/aa.txt","r+") # 打开 aa.txt 文件,权限为:读写模式
str_1 = fo.read( 3 ) # 读取 2 个字节的内容,此时指针向后移动 2 个字节
position = fo.tell() # 获取已经读取2字节后的指针位置
print( "当前指针位置:" ,position ," ,读取到的内容为:" ,str_1 ) # 查看当前指针所处位置
fo.seek( 0, 0) # 将指针重新设置为文件的起始位置
str_2 = fo.read( 4 ) # 重新读取内容
print( "重新设置后的指针位置:" ,fo.tell( ) ," ,读取到的新内容为:" ,str_2) # 再次查看指针位置
fo.close() # 关闭文件
运行输出:
当前指针位置: 3 ,读取到的内容为: Hel
重新设置后的指针位置: 4 ,读取到的新内容为: Hell
注意:在进行本实例时,一定要注意编辑文件的模式。不同的编辑模式,很大程度上影响着本实例的实现。
重命名和删除文件
在对文件进行重命名或删除等操作时,需要用到Python提供的OS模块,通过该模块里的一些方法即可实现这些操作。
该模块还提供了很多常用操作,例如:目录的新建、删除等操作,后门我们再专门学习这个 OS 模块。
重命名文件
重命名一个文件,使用到的是 OS 模块中的 rename()
方法。
语法格式:
os.rename(current_file_name, new_file_name)
参数说明:参数可以是单文件名,或者带有路径的文件名,不同的情况下,不同的使用方法。
实例如下:
将 D盘 下的 aa.txt 文件重命名为 new_aa.txt 。
# !/usr/bin/python
# -*- coding: UTF-8 -*-
import os # 导入 os 模块
# 重命名 D盘 下的 aa.txt 为 new_aa.txt
os.rename( "D:/aa.txt", "D:/new_aa.txt")
运行实例:
此时打开D盘,可以看到目录下原来的 aa.txt 文本文件,已经被重命名为 new_aa.txt 文件。
删除文件
删除文件,使用到的是 OS 模块中的 remove()
方法:
语法格式:
os.remove(file_name)
实例如下:
删除 D盘 下的 new_aa.txt 文本文件。
# !/usr/bin/python
# -*- coding: UTF-8 -*-
import os # 导入 os 模块
# 删除 D盘 下的 new_aa.txt 文本文件
os.remove("D:/new_aa.txt")
运行实例:
此时,打开 D盘 可以看打原来的 new_aa.txt 的文本文件已经被删除了。
注意:以上的这两个实例,在执行中一定要注意文件的所在位置,如果所要操作的文件在当前工程中,此时可以省略声明文件的所在目录,直接使用文件名即可,Python 会自行查找得到;如果您所要编辑的文件不在当前工程或环境变量声明的目录下,此时一定要使用绝对路径进行声明,否则Python会报错,提示无法找到文件。
以下是编辑文件中的一些常用方法:
方法 | 功能 |
---|---|
file.read([count]) | 读取文件内容 |
file.write( string ) | 向文件写入内容 |
file.flush() | 将缓冲区的内容写入文件中 |
file.tell() | 查看当前指针位置 |
file.seek(offset [,whence]) | 重新设定指针的位置 |
file.next() | 返回文件当前行的所有内容 |
file.readline([size]) | 读取一整行内容,包括\n 字符 |
file.readlines([sizehint]) | 读取文件所有行内容,直至遇到EOF结束 |
file.fileno() | 返回一个整型的文件描述符(一般用于底层I/O) |
file.isatty() | 检查一个文件是否已经连接到终端设备。 |
file.truncate([size]) | 从文件中截取指定的数据内容(可设置大小) |
file.writelines(sequence) | 向文件中写入一个序列字符串列表内容 |
完整学习教程请访问:Python3 入门教程——目录索引