python 读取本地文件显示 python读取文件出错_python 读取本地文件显示


详细介绍python异常处理方法:try/except/else/finally/raise/assert
python文件读写:open/write

欢迎微信随缘关注@pythonic生物人

目录


1.异常处理
    处理单个异常:try/except
    多个异常一种方式处理:元组包含多个异常类型
    多个异常各自特异处理:多个except语句
    处理所有异常:Exception 捕获所有异常
    脚本执行之后做清理工作:finally
    没有触发异常的时候执行一些任务:try/else
    主动触发某个异常类型:raise 
    满足某个条件触发异常:assert
    python3中内置标准异常类型

2.Python中文件读写
    python3中open函数
    一次读取整个文件
    逐行读取文件
    覆盖已有内容写入文件 
    追加内容写入文件



1.异常处理

异常处理不建议随便乱用,过度使用使得代码可读性变差;在异常无法预知的情况下建议使用异常处理,其他异常尽量解决。

  • 处理单个异常:try/except

可能触发异常的代码会放到try语句块里,处理异常的代码放在except语句块里。


try:#try代码块中任何一行代码报错,该行代码后面的语句就不会执行,抛出错误类型。
    file = open('test', 'rb')
except IOError as e:
#IOError为异常类型,如果try中抛出的错误正好是该异常类型,执行except中代码处理掉异常,程序继续执行,否则终止程序。
    print('An IOError occurred. {}'.format(e.args[-1]))#处理异常的代码 。


An IOError occurred. No such file or directory

  • 多个异常一种方式处理:元组包含多个异常类型

把所有可能发生的异常类型存储到一个元组中。


try:
    file = open('test', 'rb')
except (IOError, EOFError) as e:#多个异常类型存储在(IOError, EOFError)元组中
    print("An error occurred. {}".format(e.args[-1]))


An error occurred. No such file or directory

  • 多个异常各自特异处理:多个except语句

对每个异常类型使用一个except语句块处理


try:
    file = open('test', 'rb')
except EOFError as e:#该except处理EOFError类型异常
    print("An EOF error occurred.")
except IOError as e:#该except处理IOFError类型异常
    print("An error occurred.")


An error occurred.

  • 处理所有异常:Exception 捕获所有异常
try:
    file = open('test', 'rb')
except Exception as e:#Exception捕获所有的异常类型,保存到args的元组中。
    print('All exceptions {}'.format(e.args))


All exceptions (2, 'No such file or directory')

  • 脚本执行之后做清理工作:finally

finally中的代码块不管异常是否被触发都会被执行,常用来在脚本执行之后做清理工作。


try:
    file = open('test', 'rb')
except IOError as e:
    print('An IOError occurred. {}'.format(e.args[-1]))
finally:#该语句块一定会执行,无论try中是否触发代码,无论except中是否处理异常。
    print("This would be printed whether or not an exception occurred!")


An IOError occurred. No such file or directory
This would be printed whether or not an exception occurred!

  • 没有触发异常的时候执行一些任务:try/else

try代码块中异常没被触发,执行else语句块。


try:
    print('I am sure no exception is going to occur!')
except Exception:
    print('exception')
else:#try语句块没有触发异常时运行;该代码块中异常不会被捕获。
    print('This would only run if no exception occurs. And an error here '
          'would NOT be caught.')
finally:
    print('This would be printed in every case.')


I am sure no exception is going to occur!
This would only run if no exception occurs. And an error here would NOT be caught.
This would be printed in every case.

  • 主动触发某个异常类型:raise
try:
    raise IOError('一个主动触发的异常类型')#这个异常主动触发
except Exception as e:
    print(e.args)


('一个主动触发的异常类型',)

  • 满足某个条件触发异常:assert
try:
    assert False,"前面bool判断为False是触发异常"
except Exception as e:
    print(e.args)


('前面bool判断为False是触发异常',)

  • python3中内置标准异常类型

本小菜鸟表示只见过几个,如ZeroDivisionError、ImportError、IndexError、KeyError、TypeError、ValueError、SystemError等少数几个。python3中内置的异常类型及各异常之间的继承关系,各异常类型的触发原因见下表:


python内置标准异常类型及继承关系(python3.8.3)触发异常原因
BaseException	所有内置异常的基类。
 +-- SystemExit	sys.exit()函数引发。
 +-- KeyboardInterrupt	当用户按下中断键(通常为Control-C或Delete)时将被引发。
 +-- GeneratorExit	当一个生成器generator或coroutine被关闭时将被引发
 +-- Exception	所有内置的非系统退出类异常和自定义异常都派生自此类。
      +-- StopIteration	内置函数next()和迭代器iterator的__next__()方法所引发。
      +-- StopAsyncIteration	由一个asynchronous iterator对象的__anext__()方法来引发以停止迭代操作。
      +-- ArithmeticError	各种算术类错误而引发的内置异常
      |    +-- FloatingPointError	目前未被使用,呵呵~。
      |    +-- OverflowError	当算术运算的结果大到无法表示时将被引发。
      |    +-- ZeroDivisionError	当除法或取余运算的分母为零时将被引发。
      +-- AssertionError	当assert(bool判断触发异常)语句失败时将被引发。
      +-- AttributeError	当属性引用或赋值失败时将被引发(经常见)。
      +-- BufferError	当与缓冲区相关的操作无法执行时将被引发。
      +-- EOFError	当input()函数未读取任何数据即达到文件结束条件(EOF)时将被引发。
      +-- ImportError	导入模块时引发,当import加载模块和from/import中的"from list"存在无法找到的名称时被引发。
      |    +-- ModuleNotFoundError	一个模块无法被定位时将由import引发,当在sys.modules中找到None时也会被引发。
      +-- LookupError	IndexError,KeyError异常引发及codecs.lookup()直接引发。
      |    +-- IndexError	超过序列类数据结构(list,str等)索引范围时将被引发。
      |    +-- KeyError	映射类数据结构(dict)中找不到键时将被引发。
      +-- MemoryError	当一个操作耗尽内存但情况仍可(通过删除一些对象)进行挽救时将被引发。
      +-- NameError	当某个局部或全局名称未找到时将被引发。
      |    +-- UnboundLocalError	当在函数或方法中对某个局部变量进行引用,但该变量并未绑定任何值时将被引发。
      +-- OSError	根据系统错误代码被引发。
      |    +-- BlockingIOError	当一个操作会被某个设置为非阻塞操作的对象(例如套接字)所阻塞时将被引发。
      |    +-- ChildProcessError	当一个子进程上的操作失败时将被引发。对应于errno ECHILD。
      |    +-- ConnectionError	与连接相关异常的基类。
      |    |    +-- BrokenPipeError	当试图写入另一端已被关闭的管道,或是试图写入已关闭写入的套接字时将被引发。对应于errno EPIPE和ESHUTDOWN。
      |    |    +-- ConnectionAbortedError	当连接尝试被对端中止时将被引发。对应于errno ECONNABORTED。
      |    |    +-- ConnectionRefusedError	当连接尝试被对端拒绝时将被引发。对应于errno ECONNREFUSED。
      |    |    +-- ConnectionResetError	当连接被对端重置时将被引发。对应于errno ECONNRESET。
      |    +-- FileExistsError	当试图创建一个已存在的文件或目录时将被引发。对应于 errno EEXIST。
      |    +-- FileNotFoundError	当所请求的文件或目录不存在时将被引发。对应于errno ENOENT。
      |    +-- InterruptedError	当系统调用被输入信号中断时将被引发。对应于errno EINTR。
      |    +-- IsADirectoryError	当请求对一个目录执行文件操作(例如os.remove())将被引发。对应于errno EISDIR。
      |    +-- NotADirectoryError	当请求对一个非目录对象执行目录操作(例如os.listdir())时将被引发。对应于errno ENOTDIR。
      |    +-- PermissionError	当在没有足够操作权限的情况下试图执行某个操作时将被引发——例如缺少文件系统权限。对应于errno EACCES和EPERM。
      |    +-- ProcessLookupError	当给定的进程不存在时将被引发。对应于errno ESRCH。
      |    +-- TimeoutError	当一个系统函数发生系统级超时的情况下将被引发。对应于errno ETIMEDOUT。
      +-- ReferenceError	此异常将在使用weakref.proxy()函数所创建的弱引用来访问该引用的某个已被作为垃圾回收的属性时被引发。
      +-- RuntimeError	当检测到一个不归属于任何其他类别的错误时将被引发。关联的值是一个指明究竟发生了什么问题的字符串。
      |    +-- NotImplementedError	在用户自定义的基类中,抽象方法应当在其要求所派生类重载该方法,或是在其要求所开发的类提示具体实现尚待添加时引发此异常。
      |    +-- RecursionError	解释器检测发现超过最大递归深度被引发。
      +-- SyntaxError	当解析器遇到语法错误时将被引发。
      |    +-- IndentationError	与不正确的缩进相关的语法错误的基类。
      |         +-- TabError	当缩进包含对制表符和空格符不一致的使用时将被引发。
      +-- SystemError	当解释器发现内部错误,但情况看起来尚未严重到要放弃所有希望时将被引发。
      +-- TypeError	当一个操作或函数被应用于类型不适当的对象时将被引发。
      +-- ValueError	当操作或函数接收到具有正确类型但值不适合的参数,并且情况不能用更精确的异常例如IndexError来描述时将被引发。
      |    +-- UnicodeError	当发生与Unicode相关的编码或解码错误时将被引发。
      |         +-- UnicodeDecodeError	当在"解码过程"中发生与Unicode相关的错误时将被引发。
      |         +-- UnicodeEncodeError	当在"编码过程"中发生与Unicode相关的错误时将被引发。
      |         +-- UnicodeTranslateError	在"转写过程"中发生与Unicode相关的错误时将被引发。
      +-- Warning	警告类别的基类。
           +-- DeprecationWarning	如果所发出的警告是针对其他Python开发者的,则以此作为与已弃用特性相关警告的基类。
           +-- PendingDeprecationWarning	对于已过时并预计在未来弃用,但目前尚未弃用的特性相关警告的基类。
           +-- RuntimeWarning	与模糊的运行时行为相关的警告的基类。
           +-- SyntaxWarning	与模糊的语法相关的警告的基类。
           +-- UserWarning	用户代码所产生警告的基类。
           +-- FutureWarning	如果所发出的警告是针对以Python所编写应用的最终用户的,则以此作为与已弃用特性相关警告的基类。
           +-- ImportWarning	与在模块导入中可能的错误相关的警告的基类。
           +-- UnicodeWarning	与Unicode相关的警告的基类。
           +-- BytesWarning	与bytes和bytearray相关的警告的基类。
           +-- ResourceWarning	与资源使用相关的警告的基类。 会被默认的警告过滤器忽略。



2.Python中文件读写

  • python3中open函数

语法:open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

file,被打开的文件;
mode,打开模式,默认为‘r’即读取模式;
详细如下表:
字符含义'r'读取(默认)'w'覆盖写入,如果文件中已有内容,则覆盖'x'排它性创建,如果文件已存在则失败'a'追加写入,如果文件已有内容,则在末尾追加'b'二进制模式't'文本模式(默认)'+'更新磁盘文件(读取并写入)
buffering,设置缓冲;encoding,一般使用utf8,没有指定,则根据平台来决定使用的编码;......(后面的我很少用)

  • 一次读取整个文件
file = './test.txt'#指定文件路径及文件
with open(file,encoding='gbk') as f:#关键字with 在不再需要访问文件后自动将其关闭,所以不需要close关闭文件。
    contents = f.read()#方法read()读取文件的全部内容,以字符串的形式存储在变量contents中    
print(contents)


  • 逐行读取文件
file = './test.txt'
with open(file) as f:
    for line in f:#使用for循环
        line = line.strip()#strip去掉每行末尾换行符
        print(line)


  • 覆盖已有内容写入文件
file = './test.txt'
with open(file,encoding='gbk') as f:
    contents = f.read()

with open("./test1.txt", 'w') as f:#'w'覆盖已有文件内容
    f.write(contents)


#test1.txt中内容


python 读取本地文件显示 python读取文件出错_python_02


  • 追加内容写入文件
file = './test.txt'
with open(file,encoding='gbk') as f:
    contents = f.read()

with open("./test1.txt", 'w') as f:#'w'覆盖已有文件内容
    f.write(contents)


test1.txt中内容,末尾追加了一行,不覆盖已有内容。


python 读取本地文件显示 python读取文件出错_ico_03