<p>您遇到的问题很可能是由于行尾标记的问题。在</p>
<ul>
<li>Windows/Dos通常使用<code>CRLF</code>(或,<code>\r\n</code>,或{<cd3>}字节)。在</li>
<li>Unix通常使用<code>LF</code>(或<code>\n</code>,或{<cd6>}字节)</li>
<li>MacOS通常使用<code>CR</code>(或<code>\r</code>,或{<cd9>}字节)</li>
</ul>
<p>以下是ASCII编码文件的一些示例:</p>
<pre><code>$ hexdump -C test_dos.txt
00000000 68 65 6c 6c 6f 0d 0a 77 6f 72 6c 64 0d 0a |hello..world..|
0000000e
$ hexdump -C test_nix.txt
00000000 68 65 6c 6c 6f 0a 77 6f 72 6c 64 0a |hello.world.|
0000000c
$ hexdump -C test_mac.txt
00000000 68 65 6c 6c 6f 0d 77 6f 72 6c 64 0d |hello.world.|
0000000c
</code></pre>
<p>你可以看到,单词<code>hello</code>(<code>68 65 6c 6c 6f</code>)后面分别跟着不同的字节<code>0d 0a</code>、<code>0a</code>或{<cd9>}。在MS记事本中编辑文件时,很可能会插入<code>CRLF</code>。由于<code>LF</code>在软件开发中最常见,Notepad++很可能会添加这些功能。在</p>
<p>现在,对于您的代码:给定上面的三个文件,与您的代码类似的代码会产生以下结果:</p>
<p>代码:</p>
^{pr2}$
<p>输出:</p>
<pre><code>Reading test_dos.txt
> 'hello\r\n'
> 'world\r\n'
Reading test_nix.txt
> 'hello\n'
> 'world\n'
Reading test_mac.txt
> 'hello\rworld\r'
</code></pre>
<p>可以清楚地看到,Python对<code>\n</code>字符进行拆分,但不会将其从输出中删除。这就是为什么“mac”示例只有一行。在</p>
<p>如果必须处理来自异类源的文件,请考虑使用<code>U</code>标志将“universal newlines”支持激活为<a href="http://docs.python.org/2/library/functions.html#open" rel="nofollow">open</a>。在</p>
<p>这里有一个例子。注意,唯一改变的是<code>U</code>参数改为<code>open</code>:</p>
<pre><code>files = ('test_dos.txt', 'test_nix.txt', 'test_mac.txt')
for fname in files:
print("Reading {}".format(fname))
with open(fname, 'U') as fptr:
for line in fptr:
print(" > {!r}".format(line))
print(80*"-")
</code></pre>
<p>输出:</p>
<pre><code>Reading test_dos.txt
> 'hello\n'
> 'world\n'
Reading test_nix.txt
> 'hello\n'
> 'world\n'
Reading test_mac.txt
> 'hello\n'
> 'world\n'
</code></pre>
<p>如您所见,并非所有文件的行为都相同。这可能会提示您在阅读文本文件的任何地方插入<code>U</code>。然而,我确信这是一个很好的理由,为什么它不是默认的!:)</p>