當他們在文檔中提到這個技巧時,他們不會指望你先撥動迭代器。
是的,這是預期的(當你想跳過一個標題行,然後閱讀其餘的行)。
如果你想一定要閱讀所有的行只是文件倒帶調用readlines
之前:
f.seek(0)
lines = f.readlines()
的文檔是有點稀少約readlines
不倒帶文件。我做了很多谷歌搜索,這似乎暗示&自然。如果你不仍然相信,你必須要(在Python 3.6.1源bytesio.c
)看看源代碼:
static PyObject *
_io_BytesIO_readlines_impl(bytesio *self, PyObject *arg)
/*[clinic end generated code: output=09b8e34c880808ff input=691aa1314f2c2a87]*/
{
Py_ssize_t maxsize, size, n;
PyObject *result, *line;
char *output;
CHECK_CLOSED(self);
if (PyLong_Check(arg)) {
maxsize = PyLong_AsSsize_t(arg);
if (maxsize == -1 && PyErr_Occurred())
return NULL;
}
else if (arg == Py_None) {
/* No size limit, by default. */
maxsize = -1;
}
else {
PyErr_Format(PyExc_TypeError, "integer argument expected, got '%s'",
Py_TYPE(arg)->tp_name);
return NULL;
}
size = 0;
result = PyList_New(0);
if (!result)
return NULL;
output = PyBytes_AS_STRING(self->buf) + self->pos;
while ((n = scan_eol(self, -1)) != 0) {
self->pos += n;
我停下粘貼readline的循環開始之後。在上面的行中,我們看到代碼正在使用對象的當前值self->pos
。它不會在代碼的開頭重置。
您是否有資源備份您的聲明? – pingul