====================
== Hi, I'm Vimiix ==
====================
Practice makes perfect (ง •̀_•́)ง

Python-文件操作

file Python

header

打开文件

在 Pyhton 中,使用open()函数打开文件,并返回文件对象,拿到这个文件对象,就可以读取或修改这个文件。open()是一个 python 内建函数,可以直接调用。

	#open()函数在python2.7的介绍
	Help on built-in function open in module __builtin__:

	open(...)
	    open(name[, mode[, buffering]]) -> file object

	    Open a file using the file() type, returns a file object.  This is the
	    preferred way to open a file.  See file.__doc__ for further information.

上面的介绍是在 Python2.7 中的介绍,python3 中新增了很多参数,暂不需要了解。目前只需要关注前两个参数。

第一个参数name:是传入的文件名,如果只是文件名,不带路径的话,Python 会在当前文件夹中去寻找该文件并打开。

第二个参数mode:指定文件打开的模式,默认为’r'

打开模式对应操作
‘r’只读方式打开文件,文件的指针将会放在文件的开头(默认)
‘w’只写方式打开文件,如果该文件已存在则将其覆盖,如果该文件不存在,创建新文件
‘a’追加方式打开文件。如果该文件已存在,文件指针将会放在文件的结尾,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件并写入
‘r+’打开一个文件用于读写,文件指针将会放在文件的开头
‘w+’打开一个文件用于读写,如果该文件已存在则将其覆盖,如果该文件不存在,创建新文件
‘a+’打开一个文件用于读写,如果该文件已存在,文件指针将会放在文件的结尾,文件打开时会是追加模式,如果该文件不存在,创建新文件用于读写
‘b’以二进制模式打开文件

示例:

	f=open('test.txt','w')#以只写方式打开文件test.txt
	f.close() #关闭文件

1、执行 open 语句后没有报错,就说明文件被成功的打开了。

2、调用 close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的

文件对象的方法

文件对象方法对应操作
close()关闭文件
read([size])从文件中读取 size 个字符,没有给定 size 时,读取文件所有字符,并返回一个字符串
readline()读取一行,遇到'\n’停止
readlines()一次读取所有内容,并按行返回 list
write(str)将字符串 str 写入文件
writelines(seq)向文件写入字符串序列 seq,seq 应该是一个返回字符串的可迭代对象
seek(offset[, whence])在文件中移动文件指针,从 whence(0:文件起始位置,1:当前位置,2:文件末尾)偏移 offset 个字节

读文件操作优化(本段摘自廖雪峰教程-文件读写

由于文件读写时都有可能产生IOError,一旦出错,后面的**f.close()**就不会调用。

所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try … finally来实现:

	try:
	    f = open('/path/to/file', 'r')
	    print f.read()
	finally:
	    if f:
	        f.close()

但是每次都这么写实在太繁琐,所以,Python 引入了with语句来自动帮我们调用 close()方法:

	with open('/path/to/file', 'r') as f:
	    print f.read()

这和前面的 try … finally 是一样的,但是代码更佳简洁,并且不必调用 f.close()方法。

调用 read()会一次性读取文件的全部内容,如果文件有 10G,内存就爆了,所以,要保险起见,可以反复调用 read(size)方法,每次最多读取 size 个字节的内容。另外,调用 readline()可以每次读取一行内容,调用 readlines()一次读取所有内容并按行返回 list。因此,要根据需要决定怎么调用。

如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用 read(size)比较保险;如果是配置文件,调用 readlines()最方便:

	for line in f.readlines():
	    print(line.strip()) # 把末尾的'\n'删掉

文件的定位 seek(offset[, whence])

当以不同的方式打开文件的时候,文件指针存在的位置是不同的,比如以’w’方式打开文件,文件指针是在文件起始位置,如果以’a’方式打开,文件指针是在文件末尾的。

通过 seek(offset[, whence])方法,就可以控制文件指针的位置,定位在我们需要的地方。

参数 offset 表示从文件中移动 offset 个操作标记(文件指针),正往结束方向移动,负往开始方向移动。whence,就以 whence 设定的起始位为准,0 代表从头开始,1 代表当前位置,2 代表文件最末尾位置。

实例:

	#coding=utf-8

	# 打开一个foo.txt文件
	f = open("foo.txt", "r+")
	print "Name of the file: ", f.name

	# 假设文件中包含下面5行内容
	# This is 1st line
	# This is 2nd line
	# This is 3rd line
	# This is 4th line
	# This is 5th line

	line = f.readline()
	print "Read Line: %s" % (line)

	# 将文件指针移回起始位置
	f.seek(0, 0)
	line = f.readline()
	print "Read Line: %s" % (line)

	# 关闭文件
	f.close()

执行结果:

	================== RESTART: C:/Users/vimiix/Desktop/test.py ==================
	Name of the file:  foo.txt
	Read Line: This is 1st line

	Read Line: This is 1st line

	>>>