一.文件对象
内建函数 open() 返回一个文件对象(参见下一小节), 对该文件进行后继相关的操作都要用到
它. 还有大量的函数也会返回文件对象或是类文件( file函数 )对象. 进行这种抽象处理的主要原
因是许多的输入/输出数据结构更趋向于使用通用的接口. 这样就可以在程序行为和实现上保持一
致性.
二.文件内建函数[open()和file()]
1.内建函数 open() 的基本语法是:
file_object = open(file_name, access_mode='r', buffering=-1)
可选参数 buffering 用于指示访问文件所采用的缓冲方式. 其中 0 表示不缓冲, 1
表示只缓冲一行数据, 任何其它大于 1 的值代表使用给定值作为缓冲区大小. 不提供该参数或者
给定负值代表使用系统默认缓冲机制。
2.文件对象的访问模式
文件模式 操作
r 以读方式打开
rU 或 Ua 以读方式打开, 同时提供通用换行符支持 (PEP 278)
w 以写方式打开 (必要时清空)
a 以追加模式打开 (从 EOF 开始, 必要时创建新文件)
r+ 以读写模式打开
w+ 以读写模式打开 (参见 w )
a+ 以读写模式打开 (参见 a )
rb 以二进制读模式打开
wb 以二进制写模式打开 (参见 w )
ab 以二进制追加模式打开 (参见 a )
rb+ 以二进制读写模式打开 (参见 r+ )
wb+ 以二进制读写模式打开 (参见 w+ )
ab+ 以二进制读写模式打开 (参见 a+ )
3.工厂函数file()
open() 和 file() 函数具有相同的功能, 可以任意替换.
您所看到任何使用 open() 的地方, 都可以使用 file() 替换它.
三.文件内建方法
1.输入
(1)read()方法
用来直接读取字节到字符串中, 最多读取给定数目个字节. 如果没有给定 size
参数(默认值为 -1)或者 size 值为负, 文件将被读取直至末尾.
(2)readline()方法
读取打开文件的一行(读取下个行结束符之前的所有字节). 然后整行,包括行
结束符,
作为字符串返回
。
(3)readlines()方法
并不像其它两个输入方法一样返回一个字符串. 它会读取所有(剩余的)行然
后把它们
作为一个字符串列表返回
.
2.输出
(1)writelines () 方法
它接受一个字符串列表作为参
数
, 将它们写入文件.
行结束符并不会被自动加入,
所以如果需要的话,
你必须在调用
writelines()前给每行结尾加上行结束符.
(2)write()方法
write( )函数的参数是一个字符串,分以下2种情况:
1》通过write()函数向文件中写入一行
>>> f=open(r"C:\Users\Administrator\Desktop\test.txt",'w')
>>> f.write('hello,world!\n')#写入的字符串仅仅在末尾包含一个换行符。
>>> f.close()
运行程序,结果如下:
2》通过write()函数向文件中写入多行
>>> f=open(r"C:\Users\Administrator\Desktop\test.txt",'w')
>>> f.write('hello python!\nhello world!\n')#写入的字符串包含多个换行符,可以达到写入多行的效果
>>> f.close()
运行程序,结果如下:
3.核心笔记:保留行分隔符
当使用输入方法如 read() 或者 readlines() 从文件中读取行时, Python 并不会删除行结束
符. 这个操作被留给了程序员. 例如这样的代码在 Python 程序中很常见:
f = open('myFile', 'r')
data = [line.strip() for line in f.readlines()]
f.close()
类似地, 输出方法 write() 或 writelines() 也不会自动加入行结束符. 你应该在向文件写
入数据前自己完成。
四.文件内移动
1.seek函数
2.tell函数
格式:
tell(
) 返回文件指向位置的索引
五.核心笔记: 行分隔符和其它文件系统的差异
操作系统间的差异之一是它们所支持的行分隔符不同. 在 POSIX (Unix 系列或 Mac OS X)系统
上, 行分隔符是 换行符 NEWLINE ( \n ) 字符
.
在旧的 MacOS 下是 RETURN ( \r )
, 而
DOS 和
Wind32 系统下结合使用了两者 ( \r\n ). 检查一下你所使用的操作系统用什么行分隔符。
另个不同是路径分隔符(POSIX 使用 "/", DOS 和 Windows 使用 "\", 旧版本的 MacOS 使用
":"), 它用来分隔文件路径名, 标记当前目录和父目录.
有助于跨平台开发的 os 模块属性
os 模块属性 描述
linesep 用于在文件中分隔行的字符串
sep 用来分隔文件路径名的字符串
pathsep 用于分隔文件路径的字符串
curdir 当前工作目录的字符串名称
pardir (当前工作目录的)父目录字符串名称
六.文件内建属性
文件对象的属性 描述
file.closed True表示文件已经被关闭, 否则为 False
file.encoding
文件所使用的编码 - 当 Unicode 字符串被写入数据时, 它们将自动使
用 file.encoding 转换字节字符串;若file.encoding 为 None 时使
用系统默认编码
file.mode 文件打开时使用的访问模式
file.name 文件名
file.newlines 未读取到行分隔符时为 None , 只有一种行分隔符时为一个字符串, 当文件有多种类型的行结束符时,则为一个包含所有当前所遇到的行结束符的列表
七标准文件
stdin , stdout 和 stderr . 我们说"只要你的程序一执行就可以访问这三个标准文件", 意思是这
些文件已经被预先打开了, 只要知道它们的文件句柄就可以随时访问这些文件.
Python 中可以通过 sys 模块来访问这些文件的句柄. 导入 sys 模块以后, 就可以使用
sys.stdin , sys.stdout 和 sys.stderr 访问. print 语句通常是输出到 sys.stdout ; 而内建
raw_input() 则通常从 sys.stdin 接受输入.
记得 sys.* 是文件, 所以你必须自己处理好换行符. 而 print 语句会自动在要输出的字符串
后加上换行符。
八.命令行参数
sys 模块通过 sys.argv 属性提供了对命令行参数的访问。 命令行参数是调用某个程序时除程
序名以外的其它参数. 这样命名是有历史原因的, 在一个基于文本的环境里(比如 UNIX 操作系统
的 shell 环境或者 DOS-shell ), 这些参数和程序的文件名一同被输入的. 但在 IDE 或者 GUI 环
境中可能就不会是这样了, 大多 IDE 环境都提供一个用来输入"命令行参数"的窗口; 这些参数最
后会像命令行上执行那样被传递给程序.
总结如下:
��
sys.argv 是命令行参数的列表
��
len(sys.argv) 是命令行参数的个数
九.核心模块: os (和 os.path )
从上面这些长篇讨论可以看出, os 和 os.path 模块提供了访问计算机文件系统的不同方法.
我们在本章学习的只是文件访问方面, 事实上 os 模块可以完成更多工作. 我们可以通过它管理进
程环境, 甚至可以让一个 Python 程序直接与另外一个执行中的程序"对话". 你很快就会发现自己
离不开这个模块了.
os 模块文件与目录操作
代码
import
os
for
tmpdir
in
(
'/tmp'
,
r'f:\temp'
):
#
代表两个路径
if
os.path.isdir(tmpdir): #此目录是否存在
break
else
:
print
(
'no temp directory available'
)
tmpdir=
''
if
tmpdir:
os.chdir(tmpdir)
#
改变目录
cwd=os.getcwd()
#
得到当前目录
print
(
'***current temprary directory'
)
print
(cwd)
#
打印当前目录
print
(
'*** creating example directory'
)
os.mkdir(
'example'
)
#
新建单层目录
os.chdir(
'example'
)
#
改变当前工作目录
cwd=os.getcwd()
#
得到当前目录
print
(
'***new working directory:'
)
print
(cwd)
#
打印当前目录
print
(
'***original directory:'
)
print
(os.listdir(cwd))
#
打印当前目录的文件列表
print
(
'***create text file'
)
fobj=
open
(
'test'
,
'w'
)
#
新建文件
fobj.write(
'foo
\n
'
)
fobj.write(
'bar
\n
'
)
fobj.close()
print
(
'***updated directory listing:'
)
print
(os.listdir(cwd))
#
打印当前目录文件
print
(
"renaming 'test' to 'filetest.txt'"
)
os.rename(
'test'
,
'filetest.txt'
)
#
重新给文件命名(
oldname
,
newname
)
print
(
'***updateed directory listing'
)
print
(os.listdir(cwd))
#
打印当前文件列表
path=os.path.join(cwd,os.listdir(cwd)[
0
])
#
将目录与文件连接,形成完整路径
print
(
'***full file pathname'
)
print
(path)
#
打印完整路经
print
(
'***(pathname,basename)=='
)
print
(os.path.split(path))
#
将路径目录与文件名分开
print
(
'***(filename,extension)=='
)
print
(os.path.splitext(os.path.basename(path)))
#
将文件名与扩展名分开
print
(
'*** displaying file contents:'
)
fobj=
open
(path)
for
eachline
in
fobj:
print
(eachline)
fobj.close()
print
(
'*** deleting test file'
)
os.remove(path)
#
删除文件
print
(
'***updated directory listing'
)
print
(os.listdir(cwd))
os.chdir(os.pardir)
print
(
'*** deleting test listing'
)
os.rmdir(
'example'
)
#
删除单层目录,如该目录非空则抛出异常
print
(
'***DONE'
)