Python:OS X上的os.linesep不正确

时间:2013-05-15 14:23:56

标签: python pyqt4 osx-mountain-lion eol

平台:OS X Mountain Lion
Python 2.7.4

我有一段脚本需要将字符串中的所有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 \ n(据我所知,这对于OS X是正确的)。仍然os.linesep报告\ n是eol字符,导致底部语句什么都不做。当然,该陈述的结果应该是:

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

有谁知道为什么os.linesep似乎在OSX上报告错误的eol字符?

1 个答案:

答案 0 :(得分: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:Commodore 8位计算机,Acorn BBC,ZX Spectrum,TRS-80,Apple II系列,Mac OS,最高版本9和OS-9
  •   

有关此背后的历史,请参阅Historical reason behind different line ending at different platforms

相反,这里的Scintilla错了。 Line endings documenation表示在Mac上默认为\r

  

Scintilla可以解释任何Macintosh(\r),Unix(\n)和Windows(\r\n)行结束。

您可以使用SCI_SETEOLMODE() function来改变该行为,无论Python绑定等效值应该传递os.linesep值,以使Scintilla为您的平台使用正确的行分隔符。

我发现有一个QsciScintilla.setEolMode() method和一个EOLMode enum可以实现这一目标;我想你需要将python行结束变量映射到枚举,并将正确的枚举值传递给.setEolMode()方法。