首页 > 解决方案 > TextIOWrapper.tell 会在文件开头可靠地返回零吗?

问题描述

TextIOBase.tell的文档,从中TextIOWrapper继承,状态

将当前流位置作为不透明数字返回。该数字通常不代表底层二进制存储中的字节数。

我想知道,在文件指针位于文件开头的特定情况下,它是否总是返回零?

我写了一个小的、非详尽的脚本来检查一些明显的场景,每个案例都返回零:

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);
}

显然,它计算的不仅仅是文件指针距文件开头的偏移量。但是这段代码会在文件的开头总是返回零吗?在什么情况下它不会?

我是

标签: pythonfile-iocpythonpython-internals

解决方案


推荐阅读