2013-05-15 85 views
0
不正确os.linesep

平台:OS X山狮
的Python 2.7.4的Python:在OS X

我有一段脚本,需要所有EOL字符转换将字符串中的UNIX风格\ n。 我得到一个由Qsci.Scintilla.text()提供的字符串,参考下面的txt。

print 'original text: %s' % repr(unicode(txt)) 
print 'linesep: %s' % repr(os.linesep) 
print 'fixed text: %s' % repr(unicode(txt).replace(os.linesep, '\n')) 

这说明像输出:

original text: u'exp.cnvs.show()\rself.sleep(1000)' 
linesep: '\n' 
fixed text: u'exp.cnvs.show()\rself.sleep(1000)' 

所有EOL字符有报道\ r(这是OS X AF据我所知是正确的)。仍然os.linesep报告\ n是eol字符,导致底部语句不做任何事情。当然这种说法的输出应该是:

fixed text: u'exp.cnvs.show()\nself.sleep(1000)' 

有谁知道为什么os.linesep似乎汇报OSX错了EOL字符?

回答

2

没有,\r(回车,或CR)仅用于的Mac OS正确的,所以以释放9

OS X是一个完全重写,现在基于UNIX的操作系统。它使用\n(换行符或LF)。

Wikipedia on the subject of Newline

  • LF:Multics的,Unix和类Unix系统(GNU/Linux的,Mac OS X中,FreeBSD中,AIX,Xenix的等),BeOS的,Amiga的,RISC OS和别的。

[...]

  • CR:准将8位机,橡果BBC,ZX频谱,TRS-80,苹果II系列的Mac OS多达9个版本和OS-9

请参阅Historical reason behind different line ending at different platforms了解背后的一些历史。

相反,这是在这里错误的闪烁。该Line endings documenation表明,它默认为\r当在Mac上:

Scintilla的可以解释任何Macintosh电脑(\r),UNIX(\n)和Windows(\r\n)一行结束。

可以使用SCI_SETEOLMODE() function改变这种行为,无论Python绑定当量应通过os.linesep值,使Scintilla的使用正确的行分隔符为您的平台。

我看到有一个QsciScintilla.setEolMode() method和一个EOLMode enum来完成;我想你需要将python行结尾变体映射到枚举并将正确的枚举值传递给.setEolMode()方法。

+0

好吧,这是有道理的。那么为什么Qscintilla仍然会以\ r作为换行符返回文本? –

+0

@DanielS:也许这是Qscintilla中的一个错误? –

+0

@丹尼尔斯:啊,斯蒂利亚相当过时; [我找到的文档](http://www.scintilla.org/ScintillaDoc.html#LineEndings)确实表明无论Mac OS版本如何,都使用'\ r'。将'SCI_SETEOLMODE'设置为'os.linesep'似乎是一个很好的解决方法。 –