]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.14] gh-132631: Fix "I/O operation on closed file" when parsing JSON Lines file...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Thu, 23 Apr 2026 16:32:29 +0000 (18:32 +0200)
committerGitHub <noreply@github.com>
Thu, 23 Apr 2026 16:32:29 +0000 (19:32 +0300)
Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>
Co-authored-by: Brian Schubert <brianm.schubert@gmail.com>
Lib/json/tool.py
Lib/test/test_json/json_lines.jsonl [new file with mode: 0644]
Lib/test/test_json/test_tool.py
Misc/NEWS.d/next/Library/2025-04-17-15-26-35.gh-issue-132631.IDFZfb.rst [new file with mode: 0644]

index 1967817add8abcecdc7f990cf3834af03ec62063..0cabbdba85a15513797686d5d5cded507007f762 100644 (file)
@@ -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 (file)
index 0000000..d2f2921
--- /dev/null
@@ -0,0 +1,2 @@
+{"ingredients":["frog", "water", "chocolate", "glucose"]}
+{"ingredients":["chocolate","steel bolts"]}
index 7b5d217a21558c6b501a0941ad518843b60e3e46..0a96b318b15b1c9a4e4fd23011c2c3374005661e 100644 (file)
@@ -1,4 +1,5 @@
 import errno
+import pathlib
 import os
 import sys
 import textwrap
@@ -157,6 +158,14 @@ class TestMain(unittest.TestCase):
         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 (file)
index 0000000..9cc1d5a
--- /dev/null
@@ -0,0 +1,2 @@
+Fix "I/O operation on closed file" when parsing JSON Lines file with
+:mod:`JSON CLI <json.tool>`.