频道栏目
首页 > 程序开发 > Web开发 > Python > 正文
Python 基础文件操作
2013-02-27 08:14:27           
收藏   我要投稿
File - 基础文件操作

FEB 24TH, 2013

学习一门语言,我总是喜欢从文件开始。文本文件的读写操作是我比较在意的基本功能。 在这方面,Java语言功能比较强大,用到的设计模式也非常多。只是使用起来太过繁琐。 而Python在这方面表现非常好,简洁不失功能,强大不失性能,通俗不失优雅,值得称赞。

 

我们从一个最简单的开始。

 

with open('/etc/resolv.conf') as f:

   print(f.read()) 

这里有用到with语法来关闭文件句柄。

 

open()

首先来了解下open()内置函数。

 

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

   Open file and return a corresponding file object. If the file cannot be opened, an OSError is raised. 

open()的参数众多,通常需要关注的是mode/encoding/errors/newline等。

 

最佳实践

 

(1) 读取文件必须传入字符编码encoding 

(2) 用完的流需要关闭,推荐使用with操作 

(3) 换行符尽可能的使用UNIX格式(\n),尽管python可以智能转换 

(4) 如果可以的话尽可能的使用utf-8编码来处理非ascii字符,不要依赖操作系统的编码 

小贴士

 

多个文件同时操作可使用with的语法:

 

with open('/etc/hosts','r') as f,open('/tmp/hosts','w') as t:

   //do something 

或者

 

with f=open('/etc/hosts'),t=open('/tmp/hosts','w'):

   // do something 

file object

文件对象描述的是一种“流”操作,通常支持read()或者write()方法。 这里的文件对象是一种概念上的“文件对象”,除了常见的真是的磁盘文件,还可以是 标准输入输出文件(stdin/stdout/stderr),内存缓冲区(StringIO,cStringIO), socket,pipes等。

 

这在io模块中有具体的描述。

 

文本操作和二进制操作有一些区别。分别介绍。

 

Text I/O

如果mode中包含t(默认),那么返回的流是一个纯文本操作。

 

read() 是读取文本的最简单的方法。返回的是字符串形式的结果(和参数encoding有关)。

 

read(n)

 Read and return at most n characters from the stream as a single str. If n is negative or None, reads until EOF. 

在很多安装脚本中有:

 

readme=open('./README.md').read() 

类似的用法。这在一个快速结束的程序中问题不大。在正式的服务中应该随时关闭文件句柄释放资源。

 

小贴士:

 

如果已经读取到文件末尾,read()则返回空字符串''。 

如果要读取一行,使用readline()方法。

 

readline(limit=-1)

 Read until newline or EOF and return a single str. If the stream is already at EOF, an empty string is returned. If limit is specified, at most limit characters will be read. 

读取一行意味着和行结束符有关,这个有点复杂。

 

读取多行,使用readlines()方法。这将返回一个字符串列表。readlines()也可以限制最多读取多少个字符。

 

小贴士:

 

readline(limit=-1)和readlines(limit=-1)对limit的描述不太一致。 

readline(limit=-1)描述的是读取一行,最多不超过limit个字符(不是字节),因此有可能结果不是某一行的结束。 

readlines(limit=-1)描述的是读取字符,直到limit个字符所在的行结束。也就是返回的结果一定是某一行的结束(除非EOF)。 

 

例如:

>>> open('/tmp/x1','w').write('Python真是一个好同学\n只是限制被割裂成两个版本了\n我支持python3.x')

 40 

>>> open('/tmp/x1','r').readline(10)

 'Python真是一个' 

>>> open('/tmp/x1','r').readlines(10)

 ['Python真是一个好同学\n'] 

readlines(limit)是一个难以理解的逻辑。如果可以不要随便传输一个参数。参考这里。

 

写入文本可使用write(s)方法:

 

write(s) Write the string s to the stream and return the number of characters written. 

写入的是字符串,而不是字节。如果要写入多行字符串,可以使用writelines(lines)方法。

 

小贴士:

 

write(s)和writelines(lines)不会将行结束符写入文件流。因此需要手动写入行结束符。 

Binary I/O

二进制流和文本流类似,只是二进制流没有encoding一说。打开二进制流需要传入参数mode中包含’b’。

 

例如:

 

>>> type(open('/etc/hosts','rb').read())

 <class 'bytes'> 

对比文本流,二进制流有一些小的差别:

 

read()返回的值是字节(bytes)

readline()返回的值是字节(bytes),包括换行符

readlines()返回的值是字节(bytes)列表,包括换行符

write()参数可以是bytes或者bytearray

readinto(b)是将内容读取到bytearray b中,返回读取的字节数。

其它文件操作

除了read/write方法,文件对象还有一些其它的内置方法:

 

file.close() 关闭文件

file.fileno() 获取文件描述符(整形值)

file.flush() 对于有缓冲区的写操作,刷新缓冲区

file.tell() 返回当前流的字节位置

file.seek() 移动文件流的当前位置

file.truncate() 截断文件大小

点击复制链接 与好友分享!回本站首页
相关TAG标签 文件 基础
上一篇:「学习笔记——Python」Python流程控制
下一篇:django admin 权限配置(类级别配置和字段级别配置)
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站