2013-05-15 63 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'似乎是一個很好的解決方法。 –