henu/bigjson

ValueError: I/O operation on closed file

AllexxT opened this issue · 3 comments

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

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.

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