Python读写文件

open() 方法

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 对象

file 对象使用 open 函数来创建

fobj = open(filename, 'r')
f = open("test1.txt", "a+")
print(f.read())
f.seek(0, 0) # 把文件指针从末尾移到开头,没有这句话下面的read()就读不到正确的东西
print(f.read())
f.close()

其他

跳过前2行,从第三行开始读取

fobj = open(filename, 'r')
next(fobj)
next(fobj)
for line in fobj:       #一行一行的读取
    print line
fobj.close()

读取前3行

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

判断文件开头前8个字符

fobj = open(filename, 'r')
firstline = fobj.readline()
if firstline[0:8] != 'PRODCERT':
    pass
fobj.close()

with open

with open(file, 'r') as fobj:
    pass

open 编码

要读取非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() 方法是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情。
语法格式如下:

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 模块

获取绝对路径

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 文件。