2015-12-14 41 views
3

該字符串始發作爲從返回值:爲什麼當字符串被保存到文件時 r n被轉換爲 n?

> msg = imap.uid_fetch(uid, ["RFC822"])[0].attr["RFC822"] 

在如果I型MSG控制檯,一個長的字符串被顯示雙引號和\ r \ n分隔每個行:

> msg 
"Delivered-To: [email protected]\r\nReceived: by xx.xx.xx.xx with SMTP id;\r\n" 

如果我有一個正則表達式匹配它的一部分,返回值\ r \ n爲

> msg[/Delivered-To:.*?\s+Received:/i] 
=> "Delivered-To: [email protected]\r\nReceived:" 

如果我的字符串保存到一個文件,讀回並用相同的正則表達式匹配它,我得到\ n而不是\ r \ n:

> File.write('test.txt', msg) 
> str = File.read('test.txt') 
> str[/Delivered-To:.*?\s+Received:/i] 
=> "Delivered-To: [email protected]\nReceived:" 

當字符串被保存到文件時\ r \ n被轉換爲\ n嗎? 有沒有一種方法可以將字符串保存到文件中,在沒有修改行尾的情況下將它讀回來?

+1

可能是由於操作系統? 請參閱:http://stackoverflow.com/q/27323188/3286583 –

回答

10

這是覆蓋在the IO.new documentation

以下模式必須單獨使用,與一種或多種上面看到的模式沿着。

"b" Binary file mode 
    Suppresses EOL <-> CRLF conversion on Windows. And 
    sets external encoding to ASCII-8BIT unless explicitly 
    specified. 

"t" Text file mode 

換句話說,紅寶石,像許多其他語言,感知它的操作系統,並會之間的「\ r \ n」個<自動轉換線兩端 - >「\ n」當讀/寫文本模式下的文件。使用二進制模式來避免翻譯。


str = File.read('test.txt') 

一個更好的做法是讀取使用foreach,這否定了需要更在乎行結束的文件;你會分別得到每一行。另一種方法是使用readlines,但在大文件上使用slurping which can be very costly。另外,如果您正在處理郵件文件,我強烈建議您使用寫入的內容來完成此操作,而不是編寫自己的文件。 Mail寶石就是這樣一個包裝,它是預先構建和測試的。

相關問題