Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 属性错误:';非类型';对象没有属性';阅读';?_Python - Fatal编程技术网

Python 属性错误:';非类型';对象没有属性';阅读';?

Python 属性错误:';非类型';对象没有属性';阅读';?,python,Python,我目前正在解决一些问题,我已经在这个问题上坚持了很长一段时间。我想不出怎样才能通过属性错误 在导致问题的函数中,我有另一个名为safeOpen的函数,它打开文件,但如果没有具有该特定名称的文件,则不会给出错误 def safeOpen(fileName): try: infile = open(fileName) print('Opened') except: print('None') 在我的主要函数avgSpd中,我让用户输入文件名,然后用safeOpen打开它。但

我目前正在解决一些问题,我已经在这个问题上坚持了很长一段时间。我想不出怎样才能通过属性错误

在导致问题的函数中,我有另一个名为safeOpen的函数,它打开文件,但如果没有具有该特定名称的文件,则不会给出错误

def safeOpen(fileName):
try:
    infile = open(fileName)
    print('Opened')
except:
    print('None')
在我的主要函数avgSpd中,我让用户输入文件名,然后用safeOpen打开它。但是,当程序读取该文件时,会出现以下错误:

AttributeError:'NoneType'对象没有属性'read'
。 我已经测试了safeOpen,看看这是否是问题所在,但仅测试safeOpen就表明safeOpen正在工作。任何帮助都将不胜感激

def avgSpd():
    fileName = input('Enter the file name: ')
    infile = safeOpen(fileName)
    content = infile.read()

您的
safeOpen
没有返回语句,因此
avgSpd
函数中的
infle
变量被设置为None

尝试:

值得注意的是,最好使用上下文管理器(即“with”语句)确保文件被安全打开。如果文件存在,也可以使用os.path.exists()函数检查,而不是使用try/except

比如:

import os

def safeOpen(fileName):
     if os.path.exists(fileName):
         with open(fileName) as f:
              content = f.read()
     else:
         content = None
     
     return content

def avgSpd():
    fileName = input('Enter the file name: ')
    content = safeOpen(fileName)
    if content is not None:
        do_more_stuff()

您没有在内部函数中返回
infle
变量。更正版本为:

def safeOpen(文件名):
尝试:
infle=open(文件名)
打印('打开')
除:
打印('无')
返回填充
def avgSpd():
fileName=input('输入文件名:')
infile=safeOpen(文件名)
content=infle.read()
返回内容

infle=safeOpen(fileName)
将函数调用返回的值赋给
infle
,对吗?现在的问题是:
safeOpen(fileName)
返回什么?
safeOpen
不返回
infle
(或任何东西),因此当您执行
infle=safeOpen()
时,您将
infle
的值替换为
None
。另外:不要捕获所有错误,只捕获您期望发生的错误。您可以使用
异常除外作为e:print(e)
来记录意外错误
import os

def safeOpen(fileName):
     if os.path.exists(fileName):
         with open(fileName) as f:
              content = f.read()
     else:
         content = None
     
     return content

def avgSpd():
    fileName = input('Enter the file name: ')
    content = safeOpen(fileName)
    if content is not None:
        do_more_stuff()