8

I've been adapting an old piece of code to be Python 3 compliant and I came across this individual script

"""Utility functions for processing images for delivery to Tesseract"""

import os


def image_to_scratch(im, scratch_image_name):
    """Saves image in memory to scratch file.  .bmp format will be read 
        correctly by Tesseract"""
    im.save(scratch_image_name, dpi=(200, 200))


def retrieve_text(scratch_text_name_root):
    inf = file(scratch_text_name_root + '.txt')
    text = inf.read()
    inf.close()
    return text


def perform_cleanup(scratch_image_name, scratch_text_name_root):
    """Clean up temporary files from disk"""
    for name in (scratch_image_name, scratch_text_name_root + '.txt',
                 "tesseract.log"):
        try:
            os.remove(name)
        except OSError:
            pass

On the second function, retrieve_text the first line fails with:

Traceback (most recent call last):
  File ".\anpr.py", line 15, in <module>
    text = image_to_string(Img)
  File "C:\Users\berna\Documents\GitHub\Python-ANPR\pytesser.py", line 35, in image_to_string
    text = util.retrieve_text(scratch_text_name_root)
  File "C:\Users\berna\Documents\GitHub\Python-ANPR\util.py", line 10, in retrieve_text
    inf = file(scratch_text_name_root + '.txt')
NameError: name 'file' is not defined

Is this a deprecated function or another problem alltogether? Should I be replacing file() with something like open()?

1
  • 1
    file has been deprecated even in Python 2. You should be using open Commented Aug 21, 2015 at 2:02

2 Answers 2

16

In Python 2, open and file are mostly equivalent. file is the type and open is a function with a slightly friendlier name; both take the same arguments and do the same thing when called, but calling file to create files is discouraged and trying to do type checks with isinstance(thing, open) doesn't work.

In Python 3, the file implementation in the io module is the default, and the file type in the builtin namespace is gone. open still works, and is what you should use.

Sign up to request clarification or add additional context in comments.

Comments

5

You can do what the documentation for file() suggests -

When opening a file, it’s preferable to use open() instead of invoking this constructor directly.

You should use open() method instead.

1 Comment

Just replaced it for inf = open(scratch_text_name_root + '.txt', 'r'), working nicely now :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.