转换图像文件时如何避免 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 中的可滚动框架?
如何将IPython v3笔记本转换为Jupyter v4?