输入文件:a.txt
aaaaaaaaaaaa
bbbbbbbbbbb
cccccccccccc
python代码:
with open("a.txt") as f:
for line in f:
print line
问题:
[root@a1 0]# python read_lines.wsgi
aaaaaaaaaaaa
bbbbbbbbbbb
cccccccccccc
正如您所看到的那样,输出在每个项目之间都有额外的行。
如何防止这种情况?
答案 0 :(得分:16)
print
附加换行符,输入行已经以换行符结尾。
标准解决方案是逐字输出输入行:
import sys
with open("a.txt") as f:
for line in f:
sys.stdout.write(line)
PS :对于Python 3(或带有打印功能的Python 2),abarnert的print(…, end='')
解决方案是最简单的。
答案 1 :(得分:7)
正如其他答案所解释的那样,每一行都有一个换行符;当你print
一个裸字符串时,它会在末尾添加一行。有两种方法可以解决这个问题;其他一切都是对同一两个想法的变异。
首先,您可以在阅读时删除换行符:
with open("a.txt") as f:
for line in f:
print line.rstrip()
这将删除任何其他尾随空格,如空格或制表符,以及换行符。通常你不关心这个。如果这样做,您可能希望使用通用换行模式,并删除换行符:
with open("a.txt", "rU") as f:
for line in f:
print line.rstrip('\n')
但是,如果您知道文本文件将是,例如,Windows换行文件,或者本机到任何平台,我现在正在运行的换行文件,您可以删除恰当的结局:
with open("a.txt") as f:
for line in f:
print line.rstrip('\r\n')
with open("a.txt") as f:
for line in f:
print line.rstrip(os.linesep)
另一种方法是保留原始换行符,并避免打印额外的换行符。虽然您可以通过sys.stdout
写sys.stdout.write(line)
来执行此操作,但也可以从print
本身开始。
如果您只是在print
语句的末尾添加逗号,而不是打印换行符,则会添加“智能空间”。 Exactly what that means有点棘手,但这个想法应该是它应该增加一个空间,而不应该增加空间。像大多数DWIM算法一样,它并不总能让事情正确 - 但在这种情况下,确实如此:
with open("a.txt") as f:
for line in f:
print line,
当然我们现在假设文件的换行符与你的终端匹配 - 如果你用Unix终端上的经典Mac文件试试这个,你最终会在最后一行打印每行。同样,你可以通过使用通用换行来解决这个问题。
无论如何,您可以通过使用print函数而不是print语句来避免智能空间的DWIM魔力。在Python 2.x中,您可以使用__future__
声明来实现此目的:
from __future__ import print_function
with open("a.txt") as f:
for line in f:
print(line, end='')
如果您愿意,也可以使用six
之类的第三方包装器库。
答案 2 :(得分:2)
最后的每一行作为换行符,python中的print
语句也会添加换行符。您可以删除换行符:
with open("a.txt") as f:
for line in f:
print line.strip()
答案 3 :(得分:1)
你也可以尝试splitlines()
功能,它会自动剥离:
f = open('a.txt').read()
for l in f.splitlines():
print l
答案 4 :(得分:0)
它没有添加换行符,但文件中的每个扫描行都有一个尾随行。
尝试:
with open ("a.txt") as f:
for line in (x.rstrip ('\n') for x in f):
print line