ValueError: I/O operation on closed file
AllexxT opened this issue · 3 comments
AllexxT commented
sample.json schema looks like that
[{"title": "some title", "body": "some text"}, ...]
When I am trying to get an object from a file, I'm getting an error.
In [40]: with open('sample.json', 'rb') as f:
...: bigf = bigjson.load(f)
...:
...:
In [41]: item = bigf[500000]
error trace
ValueError Traceback (most recent call last)
<ipython-input-41-0000354c06e2> in <module>
----> 1 item = bigf[500000]
~/Documents/playground/.env/lib/python3.8/site-packages/bigjson/array.py in __getitem__(self, index)
107 return self.reader.read(read_all=False)
108 else:
--> 109 self.reader.read(read_all=True)
110
111 # Skip comma and whitespace around it
~/Documents/playground/.env/lib/python3.8/site-packages/bigjson/filereader.py in read(self, read_all, to_python)
130 return obj.to_python()
131 else:
--> 132 return Object(self, read_all)
133
134 c = self._peek()
~/Documents/playground/.env/lib/python3.8/site-packages/bigjson/obj.py in __init__(self, reader, read_all)
22 return
23
---> 24 self._read_all()
25
26 def keys(self):
~/Documents/playground/.env/lib/python3.8/site-packages/bigjson/obj.py in _read_all(self, to_python)
120 python_dict[key] = self.reader.read(read_all=True, to_python=True)
121 else:
--> 122 self.reader.read(read_all=True)
123
124 self.length += 1
~/Documents/playground/.env/lib/python3.8/site-packages/bigjson/filereader.py in read(self, read_all, to_python)
82
83 while True:
---> 84 c = self._get()
85
86 if c == b'"':
~/Documents/playground/.env/lib/python3.8/site-packages/bigjson/filereader.py in _get(self)
148
149 def _get(self):
--> 150 self._ensure_readbuf_left(1)
151 if len(self.readbuf) - self.readbuf_read < 1:
152 raise Exception(u'Unexpected end of file when getting next byte!')
~/Documents/playground/.env/lib/python3.8/site-packages/bigjson/filereader.py in _ensure_readbuf_left(self, minimum_left)
193 read_amount = max(minimum_left, FileReader._READBUF_CHUNK_SIZE) - (len(self.readbuf) - self.readbuf_read)
194 self.readbuf_pos += self.readbuf_read
--> 195 old_pos = self.file.tell()
196 self.readbuf = self.readbuf[self.readbuf_read:] + self.file.read(read_amount)
197 self.readbuf_read = 0
ValueError: I/O operation on closed file
sirajalam049 commented
Same error
henu commented
You should not close the file as long as you want to get something out of it. The main idea of the library is that it doesn't read the whole file to the memory, but instead works with an open file, thus minimizing memory usage.
I'm closing the issue, as it is not bug.
TrevorMcGuireNG commented
I had the same issue. It was just caused by me exiting the with clause. When you do that, some amount of the json stays in memory, so it won't throw an error immediately.
Instead, use this:
with open('sample.json', 'rb') as f:
bigf = bigjson.load(f)
item = bigf[500000]
item