1

ドキュメントから:

readlines(hint=-1)
    Read and return a list of lines from the stream. 
    hint can be specified to control the number of lines read: 
      no more lines will be read if the total size (in bytes/characters) of all lines so far exceeds hint.

ヒントの本当の意味は何ですか?

一部の環境では:

python3 -c 'from io import StringIO;print(StringIO(u"hello\n"*10).readlines(6));import sys;print(sys.version_info[0:3])'
['hello\n', 'hello\n']
(3, 3, 0)

python -c 'from io import StringIO;print(StringIO(u"hello\n"*10).readlines(6));import sys;print(sys.version_info[0:3])'
[u'hello\n', u'hello\n']
(2, 7, 2)

python -c 'from io import StringIO;print(StringIO(u"hello\n"*10).readlines(6));import sys;print(sys.version_info[0:3])'
[u'hello\n']
(2, 6, 6)

なぜ6文字以上なのか?

バッファサイズに依存すると言う人もいます

しかし、私のマシンでは、テキストI/Oのバッファを解除できません。

>>> import sys
>>> sys.version
'3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 01:25:11) \n[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]'
>>> open('/etc/hosts','r',3).readlines(3)
['##\n', '# Host Database\n']
>>> open('/etc/hosts','r',0).readlines(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: can't have unbuffered text I/O
>>> 

それとも、この方法のバグですか?


2013/02/25更新:

ソース(python 2.6 / 2.7 / 3.xから)を確認しましたが、これを説明できません:

def readlines(self, hint=None):
    """Return a list of lines from the stream.

    hint can be specified to control the number of lines read: no more
    lines will be read if the total size (in bytes/characters) of all
    lines so far exceeds hint.
    """
    if hint is None or hint <= 0:
        return list(self)
    n = 0
    lines = []
    for line in self:
        lines.append(line)
        n += len(line)
        if n >= hint:
            break
    return lines
4

2 に答える 2

0

私は StringIO と BytesIO との違いを見つけました(しかし、理由はわかりません):

最初にこれを確認してください(python 2.7/3.3):

Python 2.7.2 (default, Jun 20 2012, 16:23:33) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from io import BytesIO,StringIO
>>> print(BytesIO(b'hello\n'*10).readlines(6))
['hello\n']
>>> print(StringIO(u'hello\n'*10).readlines(6))
[u'hello\n', u'hello\n']
>>> 

StringIO および BytesIO リンクの C ソース コードは次のとおりです。

モジュール/_io/iobase.c#l591

620     while (1) {
621         PyObject *line = PyIter_Next(self);
622         if (line == NULL) {
623             if (PyErr_Occurred()) {
624                 Py_DECREF(result);
625                 return NULL;
626             }
627             else
628                 break; /* StopIteration raised */
629         }
630 
631         if (PyList_Append(result, line) < 0) {
632             Py_DECREF(line);
633             Py_DECREF(result);
634             return NULL;
635         }
636         length += PyObject_Size(line);
637         Py_DECREF(line);
638 
639         if (length > hint)
640             break;
641     }

モジュール/_io/bytesio.c#l380

413     while ((n = get_line(self, &output)) != 0) {
414         line = PyBytes_FromStringAndSize(output, n);
415         if (!line)
416             goto on_error;
417         if (PyList_Append(result, line) == -1) {
418             Py_DECREF(line);
419             goto on_error;
420         }
421         Py_DECREF(line);
422         size += n;
423         if (maxsize > 0 && size >= maxsize)
424             break;
425     }
426     return result;
于 2013-02-26T03:35:16.323 に答える
0

文書化されているため、バグではありません。

bufferingバッファリング ポリシーの設定に使用されるオプションの整数です。0バッファリングをオフにする(バイナリ モードでのみ許可される)、ライン バッファリングを選択する (テキスト モードでのみ使用できる) 、および 固定サイズのチャンク バッファーのサイズを示す1整数 >を渡します。1

あなたの質問に答えるには:「なぜ6文字以上なのですか?」

これも文書化されています:readlines常に完全な行を返します:

読み取る行数を制御するのに ヒント を指定できます。これまでのすべての行の合計サイズ (バイト数/文字数) が ヒント を超える場合、それ以上の行は読み取られません。

つまり、別の行全体を読み取ります。total read size>の場合hint、読み取りを停止します。

あなたの例では、最初"hello"の行を読み取った後、まだサイズを超えていないため、2 行目が読み取られます。

于 2013-02-24T10:20:44.123 に答える