转换图像文件时如何避免 Jupyter 中的 AttributionError?

Posted

技术标签:

【中文标题】转换图像文件时如何避免 Jupyter 中的 AttributionError?【英文标题】:How to avoid AttributionError in Jupyter when converting image file? 【发布时间】:2021-01-03 16:46:58 【问题描述】:

我面临的问题是我的代码不断在我的 Jupyter Notebook 中抛出 AttributionError,即使我什至没有调用指定为错误的函数。我的python代码如下:

 import numpy as np
 import matplotlib
 matplotlib.use('nbagg')
 import matplotlib.pyplot as plt
 import seaborn as sns
 import pandas as pd 
 import os
 from PIL import Image

cube_features = []
 for cube in cubes:
df_cube = pd.read_csv(cube_base + 'props_cube.csv'.format(cube),
                        names=['cube', 'phi_x', 'phi_y', 'fir_x', 'fir_y', 'bush_x', 'bush_y', 'sun_x', 'sun_y', 'poplar_x', 'poplar_y', 'img_path'])
area_features = [] 
for area in areas:
    if area == 'Moc':
        features = []
        for row in df_cube['img_path']:
            image = Image.open(row).convert('RGB')
            features.append(np.array(image).flatten())
        features = np.array(features)
    else:
        features_dict = np.atleast_1d(np.load('/Users/tol/Features/CORnetZ/cube_CORnet-Z__output_feats.npy'.format(cube, area), allow_pickle=True))[0]
        if not all(np.array(features_dict['fnames']) == df_cube['img_path'].values): 
            raise ValueError('My Error')
        features = features_dict['model_feats']
    print('Cube , Area  - Representation size '.format(cube, area, features.shape))
    #area_corr = pd.DataFrame(features.transpose()).corr() # num_images x num_images
    area_features.append(features)
cube_features.append(area_features)

我的错误代码是:

    AttributeError                            Traceback (most recent call last)
  /opt/anaconda3/lib/python3.8/site-packages/PIL/Image.py in open(fp, mode, formats)
   2894     try:
 -> 2895         fp.seek(0)
   2896     except (AttributeError, io.UnsupportedOperation):

    AttributeError: 'float' object has no attribute 'seek'

    During handling of the above exception, another exception occurred:

    AttributeError                            Traceback (most recent call last)
    <ipython-input-43-31c8f89d4a7f> in <module>
       8             features = []
       9             for row in df_cube['img_path']:
     ---> 10                 image = Image.open(row).convert('RGB')
      11                 features.append(np.array(image).flatten())
      12             features = np.array(features)

    /opt/anaconda3/lib/python3.8/site-packages/PIL/Image.py in open(fp, mode, formats)
     2895         fp.seek(0)
     2896     except (AttributeError, io.UnsupportedOperation):
     -> 2897         fp = io.BytesIO(fp.read())
     2898         exclusive_fp = True
     2899 

     AttributeError: 'float' object has no attribute 'read'

我真的希望有人可以帮助我!谢谢!

【问题讨论】:

看起来row 是一个浮点数而不是路径字符串。检查您的df_cube['img_path'] df_cube['img_path'] 中有什么内容?你在image = Image.open(row).convert('RGB') 线上失败了,我可以通过Image.open(1.0) 得到同样的错误。如果fp 参数不是字符串或Path 对象,则代码假定它是文件对象并试一试。 df_cube 是 csv 文件 (df_cube = pd.read_csv...) 的数据,在此文件中,“img_path”是包含图像绝对路径的列。我想打开这些图像并将它们转换为 RGB,但我不知道为什么代码不起作用......所以行值实际上是一个字符串/路径。所以不知道为什么会出现这个问题。 image = Image.open(row).convert('RGB') 之前最好检查print(row),因为看起来row 不是您所期望的。我不确定DataFrame 是否像list 一样工作——也许在for-loop 中它给出的是索引而不是预期值。也许它需要.iterow() 或类似的东西。或者它可能错误地读取数据,现在您在此列中有数字 - 或某行中至少有一个数字。 是的,你是对的,实际上每个路径字符串中都有一个我无法删除的数字,因为它表示某个配置的计数。如何确保该行始终获得正确的图像路径?希望你能帮助我!谢谢! 【参考方案1】:

我的问题的答案很简单:我在读取 csv 文件时忘记指定分隔符,因此数据没有正确保存。 “行”指向一个空列。

始终打印您读过的内容。

感谢您的帮助!

【讨论】:

以上是关于转换图像文件时如何避免 Jupyter 中的 AttributionError?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Jupyter Notebook 中显示文件中的图像?

如何避免输出到 jupyter notebook 中的可滚动框架?

如何保存 Jupyter html 输出的图像快照?

如何将IPython v3笔记本转换为Jupyter v4?

我在主页上有很多Jupyter笔记本,当Jupyter启动时会显示。我该如何清洁其中一些?

转换为png时如何更改图像中的单一颜色?