python3.5版本使用openpyxl报‘NoneType‘ object has no attribute ‘read‘问题

在新装的ubuntu16.04系统使用默认的python3.5时,需要用到openpyxl,于是直接按照下述指令装载

sudo pip3 install openpyxl

使用时,会提示版本不匹配,百度搜索,说openpyxl的3.x.x版本已不再支持python3.5,起码要使用python3.6。

考虑到新装机的普适性,尝试寻找python3.5适配的解决办法,百度到一个说指定版本2.6.0就可以。

sudo pip3 install openpyxl==2.6.0

发现可以import使用了。

但是在调用程序时,在wb.save(full_path)时又报了错误:AttributeError: 'NoneType' object has no attribute 'read',如下图所示。

wb.save(full_path)
  File "/usr/local/lib/python3.5/dist-packages/openpyxl/workbook/workbook.py", line 396, in save
    save_workbook(self, filename)
  File "/usr/local/lib/python3.5/dist-packages/openpyxl/writer/excel.py", line 295, in save_workbook
    writer.save()
  File "/usr/local/lib/python3.5/dist-packages/openpyxl/writer/excel.py", line 276, in save
    self.write_data()
  File "/usr/local/lib/python3.5/dist-packages/openpyxl/writer/excel.py", line 76, in write_data
    self._write_worksheets()
  File "/usr/local/lib/python3.5/dist-packages/openpyxl/writer/excel.py", line 226, in _write_worksheets
    self._write_comment(ws)
  File "/usr/local/lib/python3.5/dist-packages/openpyxl/writer/excel.py", line 180, in _write_comment
    vml = fromstring(self.workbook.vba_archive.read(ws.legacy_drawing))
AttributeError: 'NoneType' object has no attribute 'read'

开始搜到的解决办法:在打开文件时,带上参数keep_vba=True

wb = load_workbook(full_path, keep_vba=True)

这样修改后执行确实没问题了,但是重复执行时,又报错了,且搜索的解答中有留言说多次执行后,文件就损坏打不开了。所以这个解决办法并不是最终的解决办法。

继续搜索找解决办法,外网有留言说这就是个bug,已在后续的版本中解决了。

回想自己为了适配ubuntu16.04默认的python3.5版本,装载openpyxl时,指定了版本2.6.0(也是百度搜到的解决办法),所以可能用新的版本就可以解决这个问题。

openpyxl - A Python library to read/write Excel 2010 xlsx/xlsm files — openpyxl 3.0.10 documentation

官网上找到各个版本的介绍:https://openpyxl.readthedocs.io

发现2.6.x系列最终的版本是2.6.4版本,确认一下是否支持python3.5,明确的说明了支持python2.7和python3.5,所以嘛,重新装载2.6.4版本:

sudo pip3 install openpyxl==2.6.4

 问题彻底搞定。


                
<think>嗯,我现在遇到了一个Python错:AttributeError: &#39;NoneType&#39; object has no attribute &#39;splitlines&#39;。这该怎么解决呢? 首先,我得理解这个错误的意思。错误提示说,&#39;NoneType&#39;对象没有&#39;splitlines&#39;属性。也就是说,我可能在某个None值上调用了splitlines方法,而None是没有任何方法的。这说明代码中某个变量被赋值为None了,而我没有检查它是否为None就直接调用了splitlines。 那splitlines方法通常用在什么地方呢?我记得这个方法通常用于字符串,把字符串按行分割成列表。比如,如果有一个多行的字符串,用splitlines()可以按换行符拆分成每一行的列表。所以问题应该出在某个预期是字符串的变量实际上却是None。 接下来,我需要找出代码中哪里调用了splitlines,然后检查那个变量为什么会是None。比如,假设我的代码中有这样一行:lines = some_function().splitlines(),如果some_function()返回了None,那么就会触发这个错误。 可能的常见原因有几个:首先,调用某个函数时,该函数在某些情况下返回了None,而我没有处理这种情况。例如,使用requests库获取响应内容时,如果response对象为None,调用response.text.splitlines()就会出错。或者,读取文件时文件不存在,导致返回None。 另外,可能是在处理数据时,某些数据源返回了空值或未正确初始化变量。例如,从数据库查询结果中获取字段值时,如果字段为空,可能会得到None。 那我该怎么调试呢?首先,我需要找到错的具体行数。查看错误堆栈信息,定位到哪一行代码引发了错误。然后检查那一行中调用splitlines的对象是什么,确定它的来源。 比如,假设错误发生在这一行: content = get_content() lines = content.splitlines() 那么问题出在get_content()返回了None。这时候需要检查get_content函数,看为什么返回了None。可能是函数中没有正确的返回语句,或者在某种条件下返回了None。 解决方法包括: 1. 在调用splitlines之前,检查变量是否为None。例如: content = get_content() if content is not None: lines = content.splitlines() else: # 处理content为None的情况,比如抛出异常或设置默认值 lines = [] 2. 确保函数get_content在所有路径下都返回字符串而不是None。例如,检查函数的逻辑,确保所有条件分支都有正确的返回值。 3. 如果是外部数据源的问题,比如网络请求或文件读取,添加异常处理机制。例如,使用try-except块捕获可能的异常,并处理返回值。 比如,使用requests时: import requests response = requests.get(url) if response.status_code == 200: content = response.text else: content = "" lines = content.splitlines() 或者处理文件读取: try: with open(&#39;file.txt&#39;, &#39;r&#39;) as f: content = f.read() except FileNotFoundError: content = "" lines = content.splitlines() 另外,可能是在链式调用中某个中间步骤返回了None。例如,data = obj.get_result().splitlines(),如果obj.get_result()返回None,就会出错。这时候需要分解步骤,先获取结果再处理。 总结一下,解决这个错误的关键步骤是: - 定位到调用splitlines的具体位置。 - 检查该对象为何为None。 - 添加必要的条件判断或异常处理,确保对象是字符串后再调用splitlines。</think>出现 `AttributeError: &#39;NoneType&#39; object has no attribute &#39;splitlines&#39;` 错误时,说明你尝试对 `None` 值调用字符串方法 `.splitlines()`。以下是详细的解决思路: --- ### **错误原因** 1. **变量为 `None`** 你调用了 `.splitlines()` 的对象实际上是 `None`,而非预期的字符串。 2. **常见场景** 例如:`text = get_data().splitlines()`,若 `get_data()` 返回 `None`,则会此错误。 --- ### **排查步骤** 1. **定位错误行** 根据错堆栈信息,找到代码中调用 `.splitlines()` 的具体位置。 2. **检查变量来源** 确认调用 `.splitlines()` 的变量是如何赋值的,常见来源包括: - 函数返回 `None` - 文件读取失败 - 网络请求未返回预期数据(如 `requests.get()` 失败) - 数据库查询结果为空 3. **验证变量类型** 在调用 `.splitlines()` 前打印变量类型: ```python print(type(your_variable)) # 预期应为 <class &#39;str&#39;> ``` --- ### **解决方法** #### 方法 1:添加空值检查 在调用 `.splitlines()` 前确保变量不是 `None`: ```python content = get_content() # 假设此函数可能返回 None if content is not None: lines = content.splitlines() else: lines = [] # 或根据需求处理空值情况 ``` #### 方法 2:设置默认值 如果变量可能为 `None`,直接赋予默认值(如空字符串): ```python content = get_content() or "" lines = content.splitlines() ``` #### 方法 3:修复数据来源 确保生成该变量的代码逻辑 **始终返回字符串**,而非 `None`。例如: ```python def get_content(): # 确保所有分支都返回字符串 if condition: return "some text"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值