2011-03-03 30 views
2

在這本書 - 核心Python編程,有下面的例子 -Python的訴說()行爲不同關於在當前文件位置

 
>>> f = open('/tmp/x', 'w+') 
>>> f.tell() 
0 
>>> f.write('test line 1\n') # add 12-char string [0-11] 
>>> f.tell() 
12 
>>> f.write('test line 2\n') # add 12-char string [12-23] 
>>> f.tell()     # tell us current file location (end)) 
24 

當我跑在我的翻譯相同的代碼,我在地方得到13L 12和26L代替24. 我在Windows上運行python 2.5。

關於行爲或tell()在版本中有什麼改變?如何判斷文件中的位置。

感謝和問候

+1

+1用於提及諸如Python版本和OS等細節。很少有人這樣做。 – MAK

回答

3

您的文件以文本模式打開。在這種模式下,Windows上的Python在Windows行尾和Unix行尾之間進行翻譯。在Windows上,一行結尾是兩個字符,而在Unix上它是一個('\n'),因此您的結果是預期的。

如果以二進制模式打開文件,則不會獲得這些翻譯。

f = open('/tmp/x', 'wb+') 

而且您還可以從tell()得到12和24。

+0

謝謝大家的回覆。但是當我在文件上做一個f.read()時,我會得到'\ n'。我沒有看到'\ r \ n'。我怎樣才能讀取實際的行分隔符? – Sumod

+0

找到答案,如果我以rb +模式打開文件,我可以閱讀\ r \ n。再次感謝所有人的回覆。 – Sumod

+0

@Sumod:是的,翻譯是在閱讀時完成的。 –

1

這是因爲Windows中的換行符是兩個字符,CR和LF。在Unix上,它們只是一個,LF。默認情況下,Python會將\n轉換爲您的操作系統的換行符。

你看到的L只是告訴你這個數字是一個長整數。

0
>>> f = open('c:\\temp\\foo', 'w+') 
>>> f.tell() 
0L 
>>> f.write('test line 1\n') 
>>> f.tell() 
13L 
>>> g = open('c:\\temp\\bar', 'wb+') 
>>> g.tell() 
0L 
>>> g.write('test line 1\n') 
>>> g.tell() 
12L 
>>> 
0

這是因爲換行符。 :) 在Unix上它是'\ n'和Mac'\ r',而且很可能是core-python的作者正在使用它。 你在Windows上,它是'\ r \ n',所以你得到額外的字符數。

相關問題