OCR 文件夹中的每个 .png 文件

OCR every .png file in a folder

我想遍历文件夹中的每个 .png 文件并打印图像中包含的每个文本。第一次迭代工作正常,但第二次出现错误。

代码:

import pytesseract
from PIL import Image
import os

directory = (r'C:\folder...')

for filename in os.listdir(directory):
    if filename.endswith('.png'):
        Image = Image.open(filename)
        im = pytesseract.image_to_string(Image)
        print(im)

输出:

Traceback (most recent call last): File "C:\Users\Artur\Desktop\Pytesseract_test.py", line 9, in Image = Image.open(filename) AttributeError: 'PngImageFile' object has no attribute 'open'

什么意思 'PngImageFile' 对象没有属性 'open'? Image = Image.open(filename) 不正是这样做的吗?

提前致谢

编辑:

最初的 PngError 已解决,但现在发生了 PIL 库的另一个错误:

import pytesseract
from PIL import Image
import os

directory = (r'C:\folder...')

for filename in os.listdir(directory):
    if filename.endswith('.png'):
        img = Image.open(filename)
        im = pytesseract.image_to_string(img)
        print(im)

输出:('frame_0000.png'的ocr正确然后)

Traceback (most recent call last):
  File "C:\Users\Artur\Desktop\Pytesseract_test.py", line 9, in <module>
    img = Image.open(filename)
  File "C:\Users\Artur\AppData\Local\Programs\Python\Python36\lib\site-packages\PIL\Image.py", line 2580, in open
    fp = builtins.open(filename, "rb")
FileNotFoundError: [Errno 2] No such file or directory: 'frame_0001.png'

编辑2:

这很奇怪。当我这样做时:

for filename in os.listdir(r'folderpath...'):
    print(filename)

它工作得很好,遍历每个文件,打印每个文件名。

但是当我这样做时:

for filename in os.listdir(r'folderpath...'):
    print(filename)
    print(pytesseract.image_to_string(Image.open(filename)))

出现错误:

Bewegung_UHF_Plots.m
Traceback (most recent call last):
  File "C:\Users\Artur\Desktop\Pytesseract_test.py", line 19, in <module>
    print(pytesseract.image_to_string(Image.open(filename)))
  File "C:\Users\Artur\AppData\Local\Programs\Python\Python36\lib\site-packages\PIL\Image.py", line 2580, in open
    fp = builtins.open(filename, "rb")
FileNotFoundError: [Errno 2] No such file or directory: 'Bewegung_UHF_Plots.m'

将变量 Image 的名称更改为其他名称,例如 picpicture

您的第一遍创建了一个对象 Image,它是 Image.open(filename),或者是文件上 'Image' class 的 'open' 方法的实现'filename'。这就是您在每次迭代中想要的。不幸的是,您所做的是启动 'Image' class 以支持您的新 'Image' 对象,因此在第二次传递 'Image' in Image.open(filename) 并不是指 'Image' class,而是指你的 'Image' 对象。

通过更改解决您的问题:

Image = Image.open(filename)
im = pytesseract.image_to_string(Image)

至:

img = Image.open(filename)
im = pytesseract.image_to_string(img)