summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvarunkasyap <varunkasyap@hotmail.com>2025-12-04 14:06:44 +0530
committerJacob Walls <jacobtylerwalls@gmail.com>2025-12-09 16:45:13 -0500
commit3ccef1d669de942b9f3280a35ad4d4422b0b46d2 (patch)
treed5f71df64dfc796b312adfe792dbcca3240da24e
parent334308efae8e0c7b1523d5583af32b674a098eba (diff)
Fixed #36768 -- Optimized string concatenation in File.__iter__().
-rw-r--r--django/core/files/base.py29
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