2015-06-14 696 views
3

请考虑下面的Python 3.x的代码:Python:为什么在使用write()时输出中会出现多余的空行?

class FancyWriter:  
    def write(self, string): 
     print('<'+string+'>') 
     return len(string)+2 

def testFancyWriter(): 
    fw = FancyWriter() 
    print("Hello World!", file=fw) 
    print("How many new lines do you see here?", file=fw) 
    print("And here?", file=fw) 
    return 

testFancyWriter() 

输出类似于如下:

<Hello World!> 
< 
> 
<How many new lines do you see here?> 
< 
> 
<And here?> 
< 
> 

为什么在这些之间的空行?

OK - 创建类似FancyWriter类的真正意图实际上是为Excel创建一个作家类: 我需要将选项卡式文本行写入Excel单元格,Excel行中的每行以及每个制表符将子字符串分隔到该行的单元格中。 奇怪的是,在那个ExcelWriter类(它也有一个像上面这样的write()函数,只是print()的调用被设置单元格值所取代),就会出现类似的现象 - 上面的FancyWriter类的输出! (我有靶细胞移动的下一行,如果输入字符串的最后一个字符是一个“\ n”)。

会有人能解释一下吗? 之间的界限究竟是什么?

什么将是一个FancyWriter“最Python的方式”(输出?文件?)类与写功能,以获得所需的输出状

<Hello World!> 
<How many new lines do you see here?> 
<And here?> 

非常感谢提前!

回答

3

你的“空白行”实际上是你的函数被调用的字符串'\n',以处理行结束。例如,如果我们改变打印到

print(repr(string)) 

,改变hello world线

print("Hello World!", file=fw, end="zzz") 

我们看到

'Hello World!' 
'zzz' 
'How many new lines do you see here?' 
'\n' 
'And here?' 
'\n' 

基本上print不建立一个字符串,然后添加它的价值,它只是通过end给作家本身。

如果你想避免这种情况,你必须避免print,我想或者你的作者特别处理接收某个(比如说空的)参数的情况,因为它看起来像print正在进行即使它是空字符串也要通过end

+0

'end ='''不起作用,因为'print'总是用空字符串调用写入器。 –

+0

@DaveJ:是的,我刚刚发现我自己。 :-)既没有None,也没有None,所以看起来我们在写作者方面必须要特殊处理(或者完全避免使用“print”)。 – DSM

+0

最好只处理'len(string)== 0'-大小写(或'string == DONTPRINT':P)不打印任何东西。 –

相关问题