idle读写文件路径_Python核心知识系列:文件操作与异常处理

本文介绍了Python中的文件操作,包括使用idle读写文件,详细讲解了不同模式的使用,以及with语句的配合。同时,文章还探讨了os模块中的文件和目录操作方法,如改变工作目录、列出文件、创建和删除目录等。此外,还总结了Python的异常处理,包括标准异常类型和try-except语句的使用。
摘要由CSDN通过智能技术生成

ed841d815a17cbfa1763667bba5960c8.png

1 文件操作

1.1 文件读写操作

文件读、写操作比较常见。这里,学习在python中如何进行文件读写。

1.1.1文件读操作

读取文件,要先判断文件是否存在。如果文件存在,则正常进行读取,否则抛出文件不存在的异常。

  • 打开文件
 open(file, mode='r', encoding=None, ...)

参数说明:

file: 必需,文件路径(相对或者绝对路径)。

mode: 可选,文件打开模式。

encoding: 编码方式,一般使用utf8。

常用的mode参数:

mode='r':以只读方式打开文件,文件的指针将会放在文件的开头。(默认模式)

mode='w':打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。

mode='a':打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。

mode='+':可读写模式,可与其他模式等配合使用,如'r+'、'w+'、'a+'等。

  • 读取文件内容

使用open()打开文件,返回一个文件对象fileObject

fileObject.readlines():一次性读取文件所有内容,并返回一个列表。

 f = open("E:/WorkSpace/test.txt", 'r')
 lines = f.readlines()
 print(lines)
 f.close()
 # 输出   由每行字符串构成列表
 ['Beautiful is better than ugly.n', 'Explicit is better than implicit.n', 'Simple is better than complex.n', 'Complex is better than complicated.n', 'Flat is better than nested.n', 'Sparse is better than dense.n']

fileObject.readline():一次读取文件一行,能解决大文件读取内存溢出问题。

 f = open("E:/WorkSpace/test.txt", 'r')
 while True:
     line = f.readline()
     if line:
         print(type(line), line)
     else:
         break
 f.close()
 # 输出
 <class 'str'> Beautiful is better than ugly.
 <class 'str'> Explicit is better than implicit.
 <class 'str'> Simple is better than complex.
 <class 'str'> Complex is better than complicated.
 <class 'str'> Flat is better than nested.
 <class 'str'> Sparse is better than dense.

fileObject.read():读取整个文件,将文件内容放到一个字符串变量中。

 f = open("E:/WorkSpace/test.txt", 'r')
 text = f.read()
 print(type(text), text)
 f.close()
 # 输出
 <class 'str'> Beautiful is better than ugly.
 Explicit is better than implicit.
 Simple is better than complex.
 Complex is better than complicated.
 Flat is better than nested.
 Sparse is better than dense.

fileObject.close():用于关闭一个已打开的文件,关闭后的文件不能再进行读写操作。

1.1.2 文件写操作

如果想向文件中写入内容,打开文件open()的模式mode可以设置为'w''w+'

  • fileObject.write(str):用于向文件中写入指定字符串,返回的是写入的字符长度。
 f = open("E:/WorkSpace/test.txt", 'w')
 content = "Simple is better than complex"
 print(f.write(content))
 f.close()
 # 输出
 29
  • fileObject.writelines():向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符n
 f = open("E:/WorkSpace/test.txt", 'w')
 str_list = ['Simple is better than complexn', 'Explicit is better than implicit']
 f.writelines(str_list)
 f.close()

1.1.3 with语句读取文件

在读写文件时,我们经常使用with语句,可以保证在文件操作后会自动关闭打开的文件。

 with open("E:/WorkSpace/test.txt", 'r') as f:
     for line in f.readlines():
         print(line)
 # 输出
 Simple is better than complex
 Explicit is better than implicit

1.2 os模块中文件/目录方法

1.2.1 os.getcwd()

返回当前工作目录。

 import os
 print(os.getcwd())
 # 输出
 E:WorkSpace

1.2.2 os.chdir(path)

用于改变当前工作目录到指定的路径。

 import os
 ​
 print(os.getcwd())  # 当前目录
 os.chdir('E:WorkSpaceEffectivePython')  # 切换到新路径
 print(os.getcwd())  # 新路径
 # 输出
 E:WorkSpace
 E:WorkSpaceEffectivePython

1.2.3 os.listdir(path)

返回path路径下包含的文件或文件夹的名字的列表。

 import os
 ​
 path = "E:/WorkSpace/EffectivePython"
 dirs = os.listdir(path)
 for file in dirs:
     print(file)
 # 输出
 .git
 .gitignore
 .vscode
 build
 make.bat
 Makefile
 README.md
 source

1.2.4 os.mkdir(path)

创建单层目录,如果该目录已存在抛出异常。

 import os
 ​
 os.mkdir('E:/WorkSpace')
 # 输出
 FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: 'E:/WorkSpace'
 import os
 ​
 os.mkdir('E:/WorkSpace/subWorkSpace')

1.2.5 os.makedirs(path)

用于递归创建多层目录,如果该目录已存在抛出异常。

 import os
 ​
 os.makedirs('E:/WorkSpace/subWorkSpace1/subWorkSpace2')

1.2.6 os.remove(path)

用于删除指定路径的文件。如果指定的路径是一个目录,将抛出 OSError

 import os
 ​
 os.remove('E:/WorkSpace/test.txt')

1.2.7 os.rmdir(path)

用于删除单层目录,仅当这文件夹是空的才可以, 否则, 抛出OSError。

 import os
 ​
 os.rmdir('E:/WorkSpace/subWorkSpace1/subWorkSpace2')  # 仅删除subWorkSpace2

1.2.8 os.removedirs(path)

递归删除目录,从子目录到父目录逐层尝试删除,遇到目录非空则抛出异常。

 import os
 ​
 os.removedirs('E:/WorkSpace/subWorkSpace1/subWorkSpace2')   # 删除/subWorkSpace1/subWorkSpace2

1.2.9 os.rename(src, dst)

用于命名文件或目录,从 src 到 dst,如果dst是一个存在的目录, 将抛出OSError。src 为要修改的目录名,dst是修改后的目录名。

 import os
 ​
 os.rename('./subWorkSpace1/subWorkSpace2', './subWorkSpace1/subWorkSpace3')  # subWorkSpace2重命名为subWorkSpace3

1.2.10 os.path模块

该模块主要用于获取文件的属性。

  • os.path.basename(path):返回文件名
  • os.path.abspath(path):返回绝对路径
  • os.path.dirname(path):返回文件路径
  • os.path.exists(path):判断指定路径(目录或文件)是否存在。
  • os.path.isabs(path):判断是否为绝对路径
  • os.path.isfile(path):判断路径是否为文件
  • os.path.isdir(path):判断路径是否为目录
  • os.path.samefile(path1, path2): 判断path1和path2是否相同
  • os.path.join(path1[, path2[, ...]]):将 path1path2 各部分组合成一个路径名
  • os.path.split(path):把路径path分割成文件路径文件名,并返回一个(file_path, file_name)元组。如果完全使用目录,它会将最后一个目录作为文件名分离,且不会判断文件或者目录是否存在。
  • os.path.splitext(path):分离文件名与扩展名,返回路径名和文件扩展名的元组。
 import os
 ​
 print(os.path.basename(r'E:WorkSpacesubWorkSpace1subWorkSpace2test.txt'))
 print(os.path.abspath(r'E:WorkSpacesubWorkSpace1subWorkSpace2test.txt'))
 print(os.path.dirname(r'E:WorkSpacesubWorkSpace1subWorkSpace2test.txt'))
 print(os.path.exists(r'E:WorkSpacesubWorkSpace1subWorkSpace2test1.txt'))
 print(os.path.isabs(r'E:WorkSpacesubWorkSpace1subWorkSpace2'))
 print(os.path.isfile(r'E:WorkSpacesubWorkSpace1subWorkSpace2test.txt'))
 print(os.path.isdir(r'E:WorkSpacesubWorkSpace1subWorkSpace2'))
 print(os.path.samefile(r'E:WorkSpacesubWorkSpace1subWorkSpace2', r'E:WorkSpacesubWorkSpace1subWorkSpace3'))
 print(os.path.join(r'E:WorkSpacesubWorkSpace1subWorkSpace3', 'test.txt'))
 print(os.path.split(r'E:WorkSpacesubWorkSpace1subWorkSpace2test.txt'))
 print(os.path.splitext(r'E:WorkSpacesubWorkSpace1subWorkSpace2test.txt'))
 # 输出
 test.txt
 E:WorkSpacesubWorkSpace1subWorkSpace2test.txt
 E:WorkSpacesubWorkSpace1subWorkSpace2
 False
 True
 True
 True
 False
 E:WorkSpacesubWorkSpace1subWorkSpace3test.txt
 ('E:WorkSpacesubWorkSpace1subWorkSpace2', 'test.txt')
 ('E:WorkSpacesubWorkSpace1subWorkSpace2test', '.txt')

2 异常处理

异常就是运行期检测到的错误。

2.1 Python 标准异常总结

  • BaseException:所有异常的基类
  • Exception:所有异常类的基类,但继承BaseException
  • AssertionError :断言语句(assert)失败
  • AttributeError:尝试访问未知的对象属性
  • IOError:输入/输出操作失败
  • OSError:操作系统产生的异常
  • KeyboardInterrupt:用户中断执行
  • ImportError:导入模块失败的时候
  • IndexError:索引超出序列的范围
  • KeyError:字典中查找一个不存在的关键字
  • MemoryError:内存溢出(可通过删除对象释放内存)
  • NameError:尝试访问一个不存在的变量
  • SyntaxError:语法错误导致的异常
  • IndentationError:缩进错误导致的异常
  • TypeError:不同类型间的无效操作
  • ValueError:传入无效的参数
  • UnicodeError:Unicode相关的异常(ValueError的子类)
  • UnicodeEncodeError:Unicode编码错误导致的异常(UnicodeError的子类)
  • UnicodeDecodeError:Unicode解码时的异常(UnicodeError的子类)
  • ZeroDivisionError:除数为零

2.2 Python标准警告总结

  • Warning:警告的基类
  • DeprecationWarning:关于被弃用的特征的警告
  • PendingDeprecationWarning:关于特性将会被废弃的警告
  • RuntimeWarning:可疑的运行时行为(runtime behavior)的警告
  • SyntaxWarning:可疑语法的警告
  • ImportWarning:用于在导入模块过程中触发的警告
  • UnicodeWarning:与Unicode相关的警告
  • BytesWarning:与字节或字节码相关的警告
  • ResourceWarning:与资源使用相关的警告

2.3 异常处理

2.3.1 try - except

 try:
     执行代码
 except Exception as error:
     发生异常时执行的代码

工作方式:

  • 首先,执行try子句。如果没有异常发生,忽略except子句,try子句执行后结束。
  • 如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。与异常类型对应的except子句将被执行。
  • 如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。

2.3.2 try-except-else

 try:
     执行代码
 except Exception as error:
     发生异常时执行的代码
 else:
     没有异常时执行的代码

比如,判断文件是否可以打开,如果打开文件时没有发生异常则执行 else 部分的语句,读取文件内容,并关闭打开的文件。

 try:
     f = open('E:/WorkSpace/test.txt', 'r')
 except Exception as err:
     print("err: %s"%err)
 else:
     content = f.readlines()
     print(content)
     f.close()

2.3.3 try - except - finally

 try:
     执行代码
 except Exception as error:
     发生异常时执行的代码
 else:
     没有异常时执行的代码
 finally:
     不管有没有异常都会执行的代码

如果一个异常在try子句里被抛出,而又没有任何的except把它截住,那么这个异常会在finally子句执行后被抛出。

 def divide(x, y):
     try:
         result = x / y
         print("result is", result)
     except ZeroDivisionError:
         print("division by zero!")
     finally:
         print("executing finally clause")
 ​
 divide(2, 4)
 # 输出
 result is 0.5
 executing finally clause
 ​
 divide(2, 0)
 # 输出
 division by zero!
 executing finally clause
 ​
 divide('2', '4')
 # 输出
 executing finally clause
 TypeError: unsupported operand type(s) for /: 'str' and 'str'

2.3.4 抛出异常

使用raise语句抛出一个指定的异常。

 raise [Exception [, args [, traceback]]]

Exception 是异常的类型(例如,NameError)参数标准异常中任一种,args 是自已提供的异常参数。最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象。

--END--

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值