open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。
open(file, mode='r')
完整的语法格式为:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明:
mode 参数有:
| 模式 | 描述 |
|---|---|
| t | 文本模式 (默认)。 |
| x | 写模式,新建一个文件,如果该文件已存在则会报错。 |
| b | 二进制模式。 |
| + | 打开一个文件进行更新(可读可写)。 |
| U | 通用换行模式(不推荐)。 |
| r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
| rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
| r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
| rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
| w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
| wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
| w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
| wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
| a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
| ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
| a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
| ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
默认为文本模式,如果要以二进制模式打开,加上 b 。
file 对象使用 open 函数来创建
fobj = open(filename, 'r')
结果是已换行的文本,不带\n
text = fobj.read().splitlines()
# 结果是一个list,每个元素以\n结尾
all_line = fobj.readlines()
for line in all_line:
print line
for line in f: print line :通过迭代器访问。
for line in fobj:
print line:# 每次读取一行。
f.write("hello\n"):如果要写入字符串以外的数据,先将他转换为字符串。
fobj = open(logfile, 'w')
fobj.write('xxx')
fobj.write('xxx')
fobj.close()
f1 = open('test1.txt', 'w')
f1.writelines(["1\n", "2\n", "3\n"])
f = open("test1.txt", "a+")
print(f.read())
f.seek(0, 0) # 把文件指针从末尾移到开头,没有这句话下面的read()就读不到正确的东西
print(f.read())
f.close()
fobj = open(filename, 'r')
next(fobj)
next(fobj)
for line in fobj: #一行一行的读取
print line
fobj.close()
fobj = open(filename, 'r')
print(fobj.readline())
print(fobj.readline())
print(fobj.readline())
fobj.close()
if(line == ''):
#注意:空白行不会被认为文件结束,因为行末会有换行符
#另一种写法:
fobj = open(file, 'r')
line = fobj.readline()
while line:
print line
line = f.readline()
fobj.close()
line = ' '
print(line.isspace())
line2 = 'ddd '
print(line2.isspace())
commention = '#;'
if line[0] in commention:
pass
fobj = open(filename, 'r')
firstline = fobj.readline()
if firstline[0:8] != 'PRODCERT':
pass
fobj.close()
with open(file, 'r') as fobj:
pass
要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件:
f = open('test.txt', 'r', encoding='gbk')
遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:
f = open('test.txt', 'r', encoding='gbk', errors='ignore')
os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下。
os.walk() 方法是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情。
语法格式如下:
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])
参数
返回值: 生成器。
for dirpath,dirnames,filenames in os.walk(rootdir):
for dirname in dirnames:
print os.path.join(dirpath,dirname)
for filename in filenames:
print os.path.join(dirpath,filename)
获取绝对路径
os.path.abspath(path)
os.path.realpath(path)
返回path规范化的绝对路径。
os.path.realpath等于os.path.abspath
获取当前脚本的路径
print(__file__)
os.path.abspath(__file__)
os.path.realpath(__file__)
获取上一级目录
os.pardir默认为: ".."
pardir = os.path.join(directory, os.pardir)
一、取得当前目录
os.getcwd()
os.path.abspath(".")
[注意]
如果是要获得程序运行的当前目录所在位置,那么可以使用os模块的os.getcwd()函数。
如果是要获得当前执行的脚本的所在目录位置,那么需要使用sys模块的sys.path[0]变量或者sys.argv[0]来获得
sys.path是Python会去寻找模块的搜索路径列表,执行脚本时,python会将执行脚本目录加入PYTHONPATH环境变量sys.path中
import os
import time
folder = time.strftime(r"%Y-%m-%d_%H-%M-%S",time.localtime())
os.makedirs(r'%s/%s'%(os.getcwd(),folder))
二、更改当前目录
os.chdir( "/root/123")
#将当前目录设为 "/root/123"
#说明: 当指定的目录不存在时,引发异常。
三、将一个路径名分解为目录名和文件名两部分
fpath , fname = os.path.split( "你要分解的路径")
例如:
a, b = os.path.split( "/root/123/test.txt" )
print a
print b
显示:
/root/123/
test.txt
# 获取path的目录
os.path.dirname(path)
其实就是os.path.split(path)的第一个元素。
# 获取path的文件名
os.path.basename(path)
如果path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素。
四、分解文件名的扩展名
fpathandname , fext = os.path.splitext( "你要分解的路径")
例如:
a, b = os.path.splitext( "/root/123/test.txt" )
print a
print b
显示:
/root/123/test
.txt
五、判断一个路径( 目录或文件)是否存在
b = os.path.exists( "你要判断的路径")
返回值b: True 或 False
六、判断一个路径是否文件
b = os.path.isfile( "你要判断的路径")
返回值b: True 或 False
七、判断一个路径是否目录
b = os.path.isdir( "你要判断的路径")
返回值b: True 或 False
八、获取某目录中的文件及子目录的列表
L = os.listdir( "你要判断的路径")
例如:
L = os.listdir( "/root/123" )
print L
显示 :
[‘test.txt', ‘test.py','python']
#这里面既有文件也有子目录
九、创建子目录
os.makedirs( path ) # path 是"要创建的子目录"
例如:
os.makedirs("/root/123")
调用有可能失败,可能的原因是:
(1) path 已存在时(不管是文件还是文件夹)
(2) 驱动器不存在
(3) 磁盘已满
(4)磁盘是只读的或没有写权限
十、删除子目录
os.rmdir( path ) # path: "要删除的子目录"
产生异常的可能原因:
(1) path 不存在
(2) path 子目录中有文件或下级子目录
(3) 没有操作权限或只读
十一、删除文件
os.remove( filename ) # filename: "要删除的文件名"
产生异常的可能原因:
(1) filename 不存在
(2) 对filename文件, 没有操作权限或只读。
十二、文件改名
os.name( oldfileName, newFilename)
产生异常的原因:
(1) oldfilename 旧文件名不存在
(2) newFilename 新文件已经存在时,此时,您需要先删除 newFilename 文件。