Будет ли TextIOWrapper.tell надежно возвращать ноль в начале файла? - PullRequest
0 голосов
/ 20 апреля 2020

Документы для TextIOBase.tell , от которых наследуется TextIOWrapper, состояние

Возвращает текущую позицию потока в виде непрозрачного числа. Число обычно не представляет количество байтов в базовом двоичном хранилище.

Мне интересно, будет ли оно всегда возвращать ноль в указанном c случае, когда указатель файла находится в начале файла?

Я написал небольшой неисчерпывающий скрипт для проверки некоторого очевидного сценария ios, который возвращал ноль для каждого случая:

import io
import os


rmodes = ['a', 'a+', 'r', 'r+']
wmodes = ['w', 'w+', 'a', 'a+', 'x', 'x+']


for m in wmodes:
    with open('empty.txt', m) as f:
        print(m, f.tell())

    os.system('rm empty.txt')


for m in rmodes:
    open('not-empty.txt', 'w').write('abc\n')

    with open('non-empty.txt', m) as f:
        f.seek(0, io.SEEK_SET)
        print(m, f.tell())

    if m == 'r':continue    # avoid exception

    with open('non-empty.txt', m) as f:
        f.truncate()
        print(m, f.tell())

Я верю этот код используется для генерации возвращаемого значения tell

static PyObject *
textiowrapper_build_cookie(cookie_type *cookie)
{
    unsigned char buffer[COOKIE_BUF_LEN];

    memcpy(buffer + OFF_START_POS, &cookie->start_pos, sizeof(cookie->start_pos));
    memcpy(buffer + OFF_DEC_FLAGS, &cookie->dec_flags, sizeof(cookie->dec_flags));
    memcpy(buffer + OFF_BYTES_TO_FEED, &cookie->bytes_to_feed, sizeof(cookie->bytes_to_feed));
    memcpy(buffer + OFF_CHARS_TO_SKIP, &cookie->chars_to_skip, sizeof(cookie->chars_to_skip));
    memcpy(buffer + OFF_NEED_EOF, &cookie->need_eof, sizeof(cookie->need_eof));

    return _PyLong_FromByteArray(buffer, sizeof(buffer),
                                 PY_LITTLE_ENDIAN, 0);
}

Очевидно, что он вычисляет больше, чем просто смещение указателя файла от начала файла. Но будет ли этот код всегда возвращать ноль в начале файла? Какие могут быть обстоятельства, при которых это не так?

Я

  • сознаю, что поведение зависит от реализации и не гарантируется документами
  • , специально спрашивающими о поведении в текстовых файлах, а не в двоичном
  • , не спрашивая «как узнать, в начале ли я файла в Python?»
  • , не запрашивая альтернативные способы получения позиция указателя файла
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...