Python Forum

Full Version: TypeError: file must have 'read' and 'readline' attributes
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
I am trying to make the below code work since morning. I have read tutorials on google about python, I have done 0 progress. Can you help me with this error:

Using TensorFlow backend. Traceback (most recent call last): File "source_code_modified.py", line 65, in <module> dict1 = pickle.load(f1,encoding='bytes') TypeError: file must have 'read' and 'readline' attributes
The code that explodes is this part:

class load_train_data: os.open("/home/mojito/Desktop/CNN/datasets/training_data/images", os.O_RDONLY) def __enter__(self): return self def __exit__(self, type, value, traceback): pass class load_test_data: os.open("/home/mojito/Desktop/CNN/datasets/test_data/images",os.O_RDONLY) def __enter__(self): return self def __exit__(self, type, value, traceback): pass with load_train_data() as f1: dict1 = pickle.load(f1,encoding='bytes')
I tried to fix this with the code below and I got a new error:

Using TensorFlow backend. Traceback (most recent call last): File "source_code_modified.py", line 74, in <module> with open_train_data() as f1: File "source_code_modified.py", line 47, in open_train_data return open('/home/mojito/Desktop/CNN/datasets/training_data/images','rb') IsADirectoryError: [Errno 21] Is a directory: '/home/mojito/Desktop/CNN/datasets/training_data/images'
the code explodes in this part:

def open_train_data(): return open('/home/mojito/Desktop/CNN/datasets/training_data/images','rb') <--- explodes here def open_test_data(): return open('/home/mojito/Desktop/CNN/datasets/test_data/images','rb') with open_train_data() as f1: dict1 = pickle.load(f1) <--- explodes here
What I am trying to do is to load a custom dataset of images for a CNN stored to my PC in the format (trainX, trainY), (testX, testY) = ...

Another question: Can I transform the folder with the images to a pickle (.P) file?
What it looks like you are trying to do is 'open' a directory to get all the images, so you can use them elsewhere.
I would recommend the glob module for that.
import glob def open_train_data(): return glob.glob('/home/mojito/Desktop/CNN/datasets/training_data/images/*') #the '*' is a 'wildcard' and it means to match one or more characters for f in open_train_data(): dict1 = pickle.load(f) ###do whatever else you need to
(Jun-12-2020, 09:01 AM)DreamingInsanity Wrote: [ -> ]What it looks like you are trying to do is 'open' a directory to get all the images, so you can use them elsewhere.
I would recommend the glob module for that.
import glob def open_train_data(): return glob.glob('/home/mojito/Desktop/CNN/datasets/training_data/images/*') #the '*' is a 'wildcard' and it means to match one or more characters for f in open_train_data(): dict1 = pickle.load(f) ###do whatever else you need to

I ran the code you posted. I got this error:

Using TensorFlow backend. Traceback (most recent call last): File "source_code_modified.py", line 78, in <module> dict1 = pickle.load(f) TypeError: file must have 'read' and 'readline' attributes
It explodes at this point:

dict1 = pickle.load(f)
Sorry, my mistake - it should work if you do this:
import glob def open_train_data(): return glob.glob('/home/mojito/Desktop/CNN/datasets/training_data/images/*') #the '*' is a 'wildcard' and it means to match one or more characters for f in open_train_data(): dict1 = pickle.load(open(f, 'rb')) ###do whatever else you need to
I forgot to open the file.
(Jun-12-2020, 10:20 AM)DreamingInsanity Wrote: [ -> ]Sorry, my mistake - it should work if you do this:
import glob def open_train_data(): return glob.glob('/home/mojito/Desktop/CNN/datasets/training_data/images/*') #the '*' is a 'wildcard' and it means to match one or more characters for f in open_train_data(): dict1 = pickle.load(open(f, 'rb')) ###do whatever else you need to
I forgot to open the file.

I am getting this error:

Using TensorFlow backend. Traceback (most recent call last): File "source_code_modified.py", line 80, in <module> dict1 = pickle.load(open(f, 'rb')) _pickle.UnpicklingError: A load persistent id instruction was encountered, but no persistent_load function was specified.
I am trying to solve it though, but I thought posting it for more help. Thank you...
Any idea?
(Jun-12-2020, 05:05 PM)hobbyist Wrote: [ -> ]Any idea?
It seems pickle.load() is for use when unpickling. If you are trying to pickle an image, you want to use pickle.dumps() which returns a pickled object.
If you want to save the pickled object to a file, you could use pickle.dump(f, open("myfile.data", "wb"))