﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-xylz,imxylz-随笔分类-Python</title><link>http://www.blogjava.net/xylz/category/44736.html</link><description>关注后端架构、中间件、分布式和高性能RESTful服务</description><language>zh-cn</language><lastBuildDate>Sun, 24 Feb 2013 18:29:36 GMT</lastBuildDate><pubDate>Sun, 24 Feb 2013 18:29:36 GMT</pubDate><ttl>60</ttl><item><title>Python 基础文件操作</title><link>http://www.blogjava.net/xylz/archive/2013/02/24/395677.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Sun, 24 Feb 2013 12:55:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2013/02/24/395677.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/395677.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2013/02/24/395677.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/395677.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/395677.html</trackback:ping><description><![CDATA[<header style="margin: 0px 0px 1.5em; padding: 2em 0px 1em; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; position: relative; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC); background-color: #f8f8f8; color: #222222; background-position: 0% 100%; background-repeat: repeat no-repeat;">
<h1>File - 基础文件操作</h1>
<p style="margin: 0px; padding: 0px; border: 0px; font-family: 'PT Sans', 'Helvetica Neue', Arial, sans-serif; font-style: inherit; font-variant: inherit; line-height: inherit; font-size: 0.9em; vertical-align: baseline; color: #aaaaaa; text-transform: uppercase; position: absolute; top: 0px;"><time datetime="2013-02-24T13:04:00+08:00" pubdate="" data-updated="true" style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; font-size: 17px; vertical-align: baseline;">FEB 24<span style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">TH</span>, 2013</time></p>
</header>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">学习一门语言，我总是喜欢从文件开始。文本文件的读写操作是我比较在意的基本功能。 在这方面，Java语言功能比较强大，用到的设计模式也非常多。只是使用起来太过繁琐。 而Python在这方面表现非常好，简洁不失功能，强大不失性能，通俗不失优雅，值得称赞。</p>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">我们从一个最简单的开始。</p>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">with open('/etc/resolv.conf') as f:<br />   print(f.read()) </code></pre>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">这里有用到<a href="http://www.python.org/dev/peps/pep-0343/" style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: #751590; -webkit-transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">with</a>语法来关闭文件句柄。</p>
<h2>open()</h2>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">首先来了解下<a href="http://docs.python.org/3.3/library/functions.html#open" style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: #751590; -webkit-transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">open()</a>内置函数。</p>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)<br />   Open file and return a corresponding file object. If the file cannot be opened, an OSError is raised. </code></pre>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">open()的参数众多，通常需要关注的是mode/encoding/errors/newline等。</p>
<h3>最佳实践</h3>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">(1) 读取文件必须传入字符编码encoding <br />(2) 用完的流需要关闭，推荐使用with操作 <br />(3) 换行符尽可能的使用UNIX格式(\n)，尽管python可以智能转换 <br />(4) 如果可以的话尽可能的使用utf-8编码来处理非ascii字符，不要依赖操作系统的编码 </code></pre>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">小贴士</p>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">多个文件同时操作可使用with的语法：</p>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">with open('/etc/hosts','r') as f,open('/tmp/hosts','w') as t:<br />   //do something </code></pre>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">或者</p>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">with f=open('/etc/hosts'),t=open('/tmp/hosts','w'):<br />   // do something </code></pre>
<h2>file object</h2>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">文件对象描述的是一种&#8220;流&#8221;操作，通常支持read()或者write()方法。 这里的文件对象是一种概念上的&#8220;文件对象&#8221;，除了常见的真是的磁盘文件，还可以是 标准输入输出文件(stdin/stdout/stderr)，内存缓冲区(StringIO,cStringIO)， socket，pipes等。</p>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">这在<a href="http://www.imxylz.com/python/io.html" style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: #751590; -webkit-transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">io</a>模块中有具体的描述。</p>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">文本操作和二进制操作有一些区别。分别介绍。</p>
<h2>Text I/O</h2>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">如果<a href="http://docs.python.org/3.3/library/functions.html#open" style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: #751590; -webkit-transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">mode</a>中包含t（默认），那么返回的流是一个纯文本操作。</p>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">read() 是读取文本的最简单的方法。返回的是字符串形式的结果（和参数encoding有关）。</p>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">read(n)<br /> Read and return at most n characters from the stream as a single str. If n is negative or None, reads until EOF. </code></pre>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">在很多安装脚本中有：</p>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">readme=open('./README.md').read() </code></pre>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">类似的用法。这在一个快速结束的程序中问题不大。在正式的服务中应该随时关闭文件句柄释放资源。</p>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">小贴士：</p>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">如果已经读取到文件末尾，read()则返回空字符串''。 </code></pre>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">如果要读取一行，使用readline()方法。</p>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">readline(limit=-1)<br /> 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. </code></pre>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">读取一行意味着和行结束符有关，这个有点复杂。</p>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">读取多行，使用readlines()方法。这将返回一个字符串列表。readlines()也可以限制最多读取多少个字符。</p>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">小贴士：</p>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">readline(limit=-1)和readlines(limit=-1)对limit的描述不太一致。 <br />readline(limit=-1)描述的是读取一行，最多不超过limit个字符（不是字节），因此有可能结果不是某一行的结束。 <br />readlines(limit=-1)描述的是读取字符，直到limit个字符所在的行结束。也就是返回的结果一定是某一行的结束(除非EOF)。 <br /><br />例如：<br />&gt;&gt;&gt; open('/tmp/x1','w').write('Python真是一个好同学\n只是限制被割裂成两个版本了\n我支持python3.x')<br /> 40 <br />&gt;&gt;&gt; open('/tmp/x1','r').readline(10)<br /> 'Python真是一个' <br />&gt;&gt;&gt; open('/tmp/x1','r').readlines(10)<br /> ['Python真是一个好同学\n'] </code></pre>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">readlines(limit)是一个难以理解的逻辑。如果可以不要随便传输一个参数。<a href="http://stackoverflow.com/questions/15050607/what-does-io-iobase-readlineshinit-mean-in-python" style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: #751590; -webkit-transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">参考这里</a>。</p>
<hr style="margin-bottom: 0.2em; color: #222222; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; font-size: 18px; line-height: 27.59375px; background-color: #f8f8f8;" />
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">写入文本可使用write(s)方法：</p>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">write(s) Write the string s to the stream and return the number of characters written. </code></pre>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">写入的是字符串，而不是字节。如果要写入多行字符串，可以使用writelines(lines)方法。</p>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">小贴士：</p>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">write(s)和writelines(lines)不会将行结束符写入文件流。因此需要手动写入行结束符。 </code></pre>
<h2>Binary I/O</h2>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">二进制流和文本流类似，只是二进制流没有encoding一说。打开二进制流需要传入参数mode中包含&#8217;b&#8217;。</p>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">例如：</p>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">&gt;&gt;&gt; type(open('/etc/hosts','rb').read())<br /> &lt;class 'bytes'&gt; </code></pre>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">对比文本流，二进制流有一些小的差别：</p>
<ul style="margin: 0px 0px 1.5em 40px; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; list-style-position: initial; list-style-image: initial; color: #222222; background-color: #f8f8f8;">
     <li style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">read()返回的值是字节(bytes)</li>
     <li style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">readline()返回的值是字节(bytes)，包括换行符</li>
     <li style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">readlines()返回的值是字节(bytes)列表，包括换行符</li>
     <li style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">write()参数可以是<a href="http://docs.python.org/3.3/library/functions.html#bytes" style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: #751590; -webkit-transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">bytes</a>或者<a href="http://docs.python.org/3.3/library/functions.html#bytearray" style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: #751590; -webkit-transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">bytearray</a></li>
     <li style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">readinto(b)是将内容读取到bytearray b中，返回读取的字节数。</li>
</ul>
<h2>其它文件操作</h2>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">除了read/write方法，文件对象还有一些其它的内置方法：</p>
<ul style="margin: 0px 0px 1.5em 40px; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; list-style-position: initial; list-style-image: initial; color: #222222; background-color: #f8f8f8;">
     <li style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">file.close() 关闭文件</li>
     <li style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">file.fileno() 获取文件描述符（整形值）</li>
     <li style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">file.flush() 对于有缓冲区的写操作，刷新缓冲区</li>
     <li style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">file.tell() 返回当前流的字节位置</li>
     <li style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">file.seek() 移动文件流的当前位置</li>
     <li style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">file.truncate() 截断文件大小</li>
</ul>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">将在<a href="http://www.imxylz.com/python/io.html" style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: #751590; -webkit-transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">I/O</a>介绍更多的知识。</p><img src ="http://www.blogjava.net/xylz/aggbug/395677.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2013-02-24 20:55 <a href="http://www.blogjava.net/xylz/archive/2013/02/24/395677.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>