https://github.com/python/cpython/commit/31ba91a35eb2e2a370734cdb4d3d3089a3272048
commit: 31ba91a35eb2e2a370734cdb4d3d3089a3272048
branch: 3.14
author: Miss Islington (bot) <[email protected]>
committer: hugovk <[email protected]>
date: 2026-04-23T19:32:29+03:00
summary:

[3.14] gh-132631: Fix "I/O operation on closed file" when parsing JSON Lines 
file (GH-132632) (#148921)

Co-authored-by: Hugo van Kemenade <[email protected]>
Co-authored-by: Brian Schubert <[email protected]>

files:
A Lib/test/test_json/json_lines.jsonl
A Misc/NEWS.d/next/Library/2025-04-17-15-26-35.gh-issue-132631.IDFZfb.rst
M Lib/json/tool.py
M Lib/test/test_json/test_tool.py

diff --git a/Lib/json/tool.py b/Lib/json/tool.py
index 1967817add8abc..0cabbdba85a155 100644
--- a/Lib/json/tool.py
+++ b/Lib/json/tool.py
@@ -88,7 +88,8 @@ def main():
             infile = open(options.infile, encoding='utf-8')
         try:
             if options.json_lines:
-                objs = (json.loads(line) for line in infile)
+                lines = infile.readlines()
+                objs = (json.loads(line) for line in lines)
             else:
                 objs = (json.load(infile),)
         finally:
diff --git a/Lib/test/test_json/json_lines.jsonl 
b/Lib/test/test_json/json_lines.jsonl
new file mode 100644
index 00000000000000..d2f292111956f3
--- /dev/null
+++ b/Lib/test/test_json/json_lines.jsonl
@@ -0,0 +1,2 @@
+{"ingredients":["frog", "water", "chocolate", "glucose"]}
+{"ingredients":["chocolate","steel bolts"]}
diff --git a/Lib/test/test_json/test_tool.py b/Lib/test/test_json/test_tool.py
index 7b5d217a21558c..0a96b318b15b1c 100644
--- a/Lib/test/test_json/test_tool.py
+++ b/Lib/test/test_json/test_tool.py
@@ -1,4 +1,5 @@
 import errno
+import pathlib
 import os
 import sys
 import textwrap
@@ -157,6 +158,14 @@ def test_jsonlines(self):
         self.assertEqual(process.stdout, self.jsonlines_expect)
         self.assertEqual(process.stderr, '')
 
+    @force_not_colorized
+    def test_jsonlines_from_file(self):
+        jsonl = pathlib.Path(__file__).parent / 'json_lines.jsonl'
+        args = sys.executable, '-m', self.module, '--json-lines', jsonl
+        process = subprocess.run(args, capture_output=True, text=True, 
check=True)
+        self.assertEqual(process.stdout, self.jsonlines_expect)
+        self.assertEqual(process.stderr, '')
+
     def test_help_flag(self):
         rc, out, err = assert_python_ok('-m', self.module, '-h',
                                         PYTHON_COLORS='0')
diff --git 
a/Misc/NEWS.d/next/Library/2025-04-17-15-26-35.gh-issue-132631.IDFZfb.rst 
b/Misc/NEWS.d/next/Library/2025-04-17-15-26-35.gh-issue-132631.IDFZfb.rst
new file mode 100644
index 00000000000000..9cc1d5a389c085
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-04-17-15-26-35.gh-issue-132631.IDFZfb.rst
@@ -0,0 +1,2 @@
+Fix "I/O operation on closed file" when parsing JSON Lines file with
+:mod:`JSON CLI <json.tool>`.

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to