diff options
| author | varunkasyap <varunkasyap@hotmail.com> | 2025-12-04 14:06:44 +0530 |
|---|---|---|
| committer | Jacob Walls <jacobtylerwalls@gmail.com> | 2025-12-09 16:45:13 -0500 |
| commit | 3ccef1d669de942b9f3280a35ad4d4422b0b46d2 (patch) | |
| tree | d5f71df64dfc796b312adfe792dbcca3240da24e | |
| parent | 334308efae8e0c7b1523d5583af32b674a098eba (diff) | |
Fixed #36768 -- Optimized string concatenation in File.__iter__().
| -rw-r--r-- | django/core/files/base.py | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/django/core/files/base.py b/django/core/files/base.py index b8613ffc55..461ff8b873 100644 --- a/django/core/files/base.py +++ b/django/core/files/base.py @@ -74,30 +74,33 @@ class File(FileProxyMixin): def __iter__(self): # Iterate over this file-like object by newlines - buffer_ = None + buffer_ = [] for chunk in self.chunks(): for line in chunk.splitlines(True): if buffer_: - if endswith_cr(buffer_) and not equals_lf(line): + if endswith_cr(buffer_[-1]) and not equals_lf(line): # Line split after a \r newline; yield buffer_. - yield buffer_ + yield type(buffer_[0])().join(buffer_) # Continue with line. + buffer_ = [] else: # Line either split without a newline (line # continues after buffer_) or with \r\n # newline (line == b'\n'). - line = buffer_ + line - # buffer_ handled, clear it. - buffer_ = None + buffer_.append(line) - # If this is the end of a \n or \r\n line, yield. - if endswith_lf(line): - yield line - else: - buffer_ = line + if not buffer_: + # If this is the end of a \n or \r\n line, yield. + if endswith_lf(line): + yield line + else: + buffer_.append(line) + elif endswith_lf(line): + yield type(buffer_[0])().join(buffer_) + buffer_ = [] - if buffer_ is not None: - yield buffer_ + if buffer_: + yield type(buffer_[0])().join(buffer_) def __enter__(self): return self |
