天天看点

python标准库学习9

<code>fileinput</code> 模块允许你循环一个或多个文本文件的内容

<code>import</code> <code>fileinput</code>

<code>import</code> <code>sys</code>

<code>for</code> <code>line</code><code>in</code> <code>fileinput.</code><code>input</code><code>(</code><code>"samples/sample.txt"</code><code>):</code>

<code>    </code><code>sys.stdout.write(</code><code>"-&gt; "</code><code>)</code>

<code>    </code><code>sys.stdout.write(line)</code>

<code>-</code><code>&gt; we will perhaps eventually be writing only small</code>

<code>-</code><code>&gt; modules which are identified by name as they are</code>

<code>-</code><code>&gt; used to build larger ones, so that devices like</code>

<code>-</code><code>&gt; indentation, rather than delimiters, might become</code>

<code>-</code><code>&gt; feasible</code><code>for</code> <code>expressing local structure</code><code>in</code> <code>the</code>

<code>-</code><code>&gt; source language.</code>

<code>-</code><code>&gt;     </code><code>-</code><code>-</code> <code>donald e. knuth, december</code><code>1974</code>

  你也可以使用 <code>fileinput</code> 模块获得当前行的元信息 (meta information). 其中包括 <code>isfirstline</code> , <code>filename</code> , <code>lineno</code>

<code>import</code> <code>glob</code>

<code>import</code> <code>string, sys</code>

<code>for</code> <code>line</code><code>in</code> <code>fileinput.</code><code>input</code><code>(glob.glob(</code><code>"samples/*.txt"</code><code>)):</code>

<code>    </code><code>if</code> <code>fileinput.isfirstline():</code><code># first in a file?</code>

<code>        </code><code>sys.stderr.write(</code><code>"-- reading %s --\n"</code> <code>%</code> <code>fileinput.filename())</code>

<code>    </code><code>sys.stdout.write(</code><code>str</code><code>(fileinput.lineno())</code><code>+</code> <code>" "</code> <code>+</code> <code>string.upper(line))</code>

<code>-</code><code>-</code> <code>reading samples\sample.txt</code><code>-</code><code>-</code>

<code>1</code> <code>we will perhaps eventually be writing only small</code>

<code>2</code> <code>modules which are identified by name as they are</code>

<code>3</code> <code>used to build larger ones, so that devices like</code>

<code>4</code> <code>indentation, rather than delimiters, might become</code>

<code>5</code> <code>feasible for expressing local structure in the</code>

<code>6</code> <code>source language.</code>

<code>7</code>    <code>-</code><code>-</code> <code>donald e. knuth, december</code><code>1974</code>

  文本文件的替换操作很简单. 只需要把 <code>inplace</code> 关键字参数设置为 1 , 传递给 <code>input</code> 函数, 该模块会帮你做好一切.

<code>import</code> <code>fileinput, sys</code>

<code>for</code> <code>line</code><code>in</code> <code>fileinput.</code><code>input</code><code>(inplace</code><code>=</code><code>1</code><code>):</code>

<code>    </code><code># convert windows/dos text files to unix files</code>

<code>    </code><code>if</code> <code>line[</code><code>-</code><code>2</code><code>:]</code><code>=</code><code>=</code> <code>"\r\n"</code><code>:</code>

<code>        </code><code>line</code><code>=</code> <code>line[:</code><code>-</code><code>2</code><code>]</code><code>+</code> <code>"\n"</code>

  <code>shutil</code> 实用模块包含了一些用于复制文件和文件夹的函数.

<code>import</code> <code>shutil</code>

<code>import</code> <code>os</code>

<code>for</code> <code>file</code> <code>in</code> <code>os.listdir(</code><code>"."</code><code>):</code>

<code>    </code><code>if</code> <code>os.path.splitext(</code><code>file</code><code>)[</code><code>1</code><code>]</code><code>=</code><code>=</code> <code>".py"</code><code>:</code>

<code>        </code><code>print</code> <code>file</code>

<code>        </code><code>shutil.copy(</code><code>file</code><code>, os.path.join(</code><code>"backup"</code><code>,</code><code>file</code><code>))</code>

<code>aifc</code><code>-</code><code>example</code><code>-</code><code>1.py</code>

<code>anydbm</code><code>-</code><code>example</code><code>-</code><code>1.py</code>

<code>array</code><code>-</code><code>example</code><code>-</code><code>1.py</code>

<code>...</code>

  <code>copytree</code> 函数用于复制整个目录树 (与 <code>cp -r</code> 相同), 而 <code>rmtree</code> 函数用于删除整个目录树 (与 <code>rm -r</code> )

<code>source</code><code>=</code> <code>"samples"</code>

<code>backup</code><code>=</code> <code>"samples-bak"</code>

<code># create a backup directory</code>

<code>shutil.copytree(source, backup)</code>

<code>print</code> <code>os.listdir(backup)</code>

<code># remove it</code>

<code>shutil.rmtree(backup)</code>

<code>[</code><code>'sample.wav'</code><code>,</code><code>'sample.jpg'</code><code>,</code><code>'sample.au'</code><code>,</code><code>'sample.msg'</code><code>,</code><code>'sample.tgz'</code><code>,</code>

<code>traceback (most recent call last):</code>

<code> </code><code>file</code> <code>"shutil-example-2.py"</code><code>, line</code><code>17</code><code>,</code><code>in</code> <code>?</code>

<code>   </code><code>print</code> <code>os.listdir(backup)</code>

<code>os.error: no such</code><code>file</code> <code>or</code> <code>directory</code>

  <code>tempfile</code> 模块允许你快速地创建名称唯一的临时文件供使用.

<code>import</code> <code>tempfile</code>

<code>tempfile</code><code>=</code> <code>tempfile.mktemp()</code>

<code>print</code> <code>"tempfile"</code><code>,</code><code>"=&gt;"</code><code>, tempfile</code>

<code>file</code> <code>=</code> <code>open</code><code>(tempfile,</code><code>"w+b"</code><code>)</code>

<code>file</code><code>.write(</code><code>"*"</code> <code>*</code> <code>1000</code><code>)</code>

<code>file</code><code>.seek(</code><code>0</code><code>)</code>

<code>print</code> <code>len</code><code>(</code><code>file</code><code>.read()),</code><code>"bytes"</code>

<code>file</code><code>.close()</code>

<code>try</code><code>:</code>

<code>    </code><code># must remove file when done</code>

<code>    </code><code>os.remove(tempfile)</code>

<code>except</code> <code>oserror:</code>

<code>    </code><code>pass</code>

<code>tempfile</code><code>=</code><code>&gt; c:\temp\~</code><code>160</code><code>-</code><code>1</code>

<code>1000</code> <code>bytes</code>

  <code>temporaryfile</code> 函数会自动挑选合适的文件名, 并打开文件而且它会确保该文件在关闭的时候会被删除. (在 unix 下, 你可以删除一个已打开的文件, 这 时文件关闭时它会被自动删除. 在其他平台上, 这通过一个特殊的封装类实现.)

<code>file</code> <code>=</code> <code>tempfile.temporaryfile()</code>

<code>for</code> <code>i</code><code>in</code> <code>range</code><code>(</code><code>100</code><code>):</code>

<code>    </code><code>file</code><code>.write(</code><code>"*"</code> <code>*</code> <code>100</code><code>)</code>

<code>file</code><code>.close()</code><code># removes the file!</code>

   <code>stringio</code> 模块的使用. 它实现了一个工作在内存的文件对象 (内存文件). 在大多需要标准文件对象的地方都可以使用它来替换.

<code>import</code> <code>stringio</code>

<code>message</code><code>=</code> <code>"that man is depriving a village somewhere of a computer scientist."</code>

<code>file</code> <code>=</code> <code>stringio.stringio(message)</code>

<code>print</code> <code>file</code><code>.read()</code>

<code>that man</code><code>is</code> <code>depriving a village somewhere of a computer scientist.</code>

  <code>stringio</code> 类实现了内建文件对象的所有方法, 此外还有 <code>getvalue</code> 方法用来返回它内部的字符串值

<code>file</code> <code>=</code> <code>stringio.stringio()</code>

<code>file</code><code>.write(</code><code>"this man is no ordinary man. "</code><code>)</code>

<code>file</code><code>.write(</code><code>"this is mr. f. g. superman."</code><code>)</code>

<code>print</code> <code>file</code><code>.getvalue()</code>

<code>this man</code><code>is</code> <code>no ordinary man. this</code><code>is</code> <code>mr. f. g. superman.</code>

  

<code>stdout</code><code>=</code> <code>sys.stdout</code>

<code>sys.stdout</code><code>=</code> <code>file</code> <code>=</code> <code>stringio.stringio()</code>

<code>print</code> <code>"""</code>

<code>according to gbaya folktales, trickery and guile</code>

<code>are the best ways to defeat the python, king of</code>

<code>snakes, which was hatched from a dragon at the</code>

<code>world's start. -- national geographic, may 1997</code>

<code>"""</code>

<code>sys.stdout</code><code>=</code> <code>stdout</code>

<code>print</code> <code>string.upper(</code><code>file</code><code>.getvalue())</code>

<code>world's start.</code><code>-</code><code>-</code> <code>national geographic, may</code><code>1997</code>

  <code>cstringio</code> 是一个可选的模块, 是 <code>stringio</code> 的更快速实现. 它的工作方式和 <code>stringio</code> 基本相同, 但是它不可以被继承

<code>import</code> <code>cstringio</code>

<code>file</code> <code>=</code> <code>cstringio.stringio(message)</code>

  为了让你的代码尽可能快, 但同时保证兼容低版本的 python ,你可以使用一个小技巧在 <code>cstringio</code> 不可用时启用 <code>stringio</code> 模块,

<code>    </code><code>import</code> <code>cstringio</code>

<code>    </code><code>stringio</code><code>=</code> <code>cstringio</code>

<code>except</code> <code>importerror:</code>

<code>    </code><code>import</code> <code>stringio</code>

<code>print</code> <code>stringio</code>

<code>&lt;module </code><code>'stringio'</code> <code>(built</code><code>-</code><code>in</code><code>)&gt;</code>

  <code>mmap</code> 模块提供了操作系统内存映射函数的接口,  映射区域的行为和字符串对象类似, 但数据是直接从文件读取的.

<code>import</code> <code>mmap</code>

<code>filename</code><code>=</code> <code>"samples/sample.txt"</code>

<code>file</code> <code>=</code> <code>open</code><code>(filename,</code><code>"r+"</code><code>)</code>

<code>size</code><code>=</code> <code>os.path.getsize(filename)</code>

<code>data</code><code>=</code> <code>mmap.mmap(</code><code>file</code><code>.fileno(), size)</code>

<code># basics</code>

<code>print</code> <code>data</code>

<code>print</code> <code>len</code><code>(data), size</code>

<code># use slicing to read from the file</code>

<code># 使用切片操作读取文件</code>

<code>print</code> <code>repr</code><code>(data[:</code><code>10</code><code>]),</code><code>repr</code><code>(data[:</code><code>10</code><code>])</code>

<code># or use the standard file interface</code>

<code># 或使用标准的文件接口</code>

<code>print</code> <code>repr</code><code>(data.read(</code><code>10</code><code>)),</code><code>repr</code><code>(data.read(</code><code>10</code><code>))</code>

<code>&lt;mmap</code><code>object</code> <code>at</code><code>008a2a10</code><code>&gt;</code>

<code>302</code> <code>302</code>

<code>'we will pe'</code> <code>'we will pe'</code>

<code>'we will pe'</code> <code>'rhaps even'</code>

  在 windows 下, 这个文件必须以既可读又可写的模式打开( `r+` , `w+` , 或 `a+` ), 否则 <code>mmap</code> 调用会失败.

<code>mport mmap</code>

<code>import</code> <code>os, string, re</code>

<code>def</code> <code>mapfile(filename):</code>

<code>    </code><code>file</code> <code>=</code> <code>open</code><code>(filename,</code><code>"r+"</code><code>)</code>

<code>    </code><code>size</code><code>=</code> <code>os.path.getsize(filename)</code>

<code>    </code><code>return</code> <code>mmap.mmap(</code><code>file</code><code>.fileno(), size)</code>

<code>data</code><code>=</code> <code>mapfile(</code><code>"samples/sample.txt"</code><code>)</code>

<code># search</code>

<code>index</code><code>=</code> <code>data.find(</code><code>"small"</code><code>)</code>

<code>print</code> <code>index,</code><code>repr</code><code>(data[index</code><code>-</code><code>5</code><code>:index</code><code>+</code><code>15</code><code>])</code>

<code># regular expressions work too!</code>

<code>m</code><code>=</code> <code>re.search(</code><code>"small"</code><code>, data)</code>

<code>print</code> <code>m.start(), m.group()</code>

<code>43</code> <code>'only small\015\012modules '</code>

<code>43</code> <code>small</code>