Ответ 1
Это документированное поведение, вызванное окончанием строки в стиле UNIX:
Верните текущую позицию файлов, например
stdio
ftell()
.Примечание. В Windows
tell()
может возвращать недопустимые значения (послеfgets()
) при чтении файлов с использованием строк в стиле Unix. Использовать двоичный режим ('rb'), чтобы обойти эту проблему.
Вышеупомянутая документация взята из документации python2.7.4. Документация для python3 немного изменилась, так как теперь есть иерархия классов, обрабатывающих I/O, и я не могу найти этот бит информации. Ваш тест показывает, что поведение не изменилось. Также исходный код для python3.3 имеет комментарий XXX Windows support below is likely incomplete
перед функцией, вызываемой tell
.
В python отладчик ошибок есть issue, и последний комментарий от Catalin Iacob:
Я попытался воспроизвести это, взял файл на своем диске, и действительно, я получил отрицательное число, но этот файл имеет окончание строки Unix. Это задокументировано на http://docs.python.org/2/library/stdtypes.html#file.tellтак что, вероятно, там нечего делать.
Что касается отчета Armin в msg180145, хотя он не интуитивно понятен, это соответствует действию ftell в Windows, как описано в примечаниях раздел http://msdn.microsoft.com/en-us/library/0ys3hc0b%28v=vs.100%29.aspx. Метод tell() в файлах файлах явно документирован как совпадение поведение ftell: "Вернуть текущую позицию файлов, например, stdio's ftell()". Поэтому, хотя это и не интуитивно понятно, возможно лучше оставить его как есть. tell() возвращает интуитивный ненулевой при открытии с помощью "a" на Python3 и Python 2.7 при использовании io.open, поэтому он все равно будет исправлен.
Таким образом, это похоже на ошибку "wontfix". Кто-то должен, вероятно, открыть проблему (прокомментировал проблему), потому что этот факт вообще не упоминается в документации python3.
В соответствии с Antoine Pitrou python3 вообще не использует ftell()
, поэтому это, похоже, является другой ошибкой. Также ошибка не воспроизводится в python3.2.3 и, вероятно, была введена при фиксации этого issue (по крайней мере, это единственное изменение, которое я могу найти к реализации tell()
между 3.2.3 и 3.3)
Последнее редактирование: согласно документации io
метод tell
делает не возвращать номер байтов с начала файла. Возвращаемое значение - это "непрозрачное число", что означает, что единственный способ использовать его - передать его в seek
, чтобы вернуться в эту позицию. Другие операции не имеют смысла. Тот факт, что до python3.2.3 возвращаемое значение было тем, что вы ожидали, было только деталью реализации.
Обратите внимание, что информация в этом разделе документации просто неверна и, надеюсь, она будет исправлена в будущем.