文章目录
- Python面试题—文件管理
- 1. 在文件操作时说明with的用法,同时说明with的语法。
- 2. 说明Python的开启文件处理模式(mode)。
- 3. 如何删除目前工作夹的文件。
- 4. 说明logging的等级。
- 5. send2trash模块。
- 6. 说明是否有模块可以配合Python使用,执行压缩或是解压缩文件或文件夹。
- 7. 说明如何遍历目录与其子目录。
- 8. 说明`try...except`的用法,并设计一个除法division()函数,即使除数为0,这个函数也不会异常终止,只是相应None。
- 9. 说明FileNotFoundError。
- 10. 说明如何使用一个except捕捉多个异常。
- 11. 说明处理异常时,使用Python内建的异常错误信息。
- 12. 说明如何捕捉所有异常。
- 13. 说明如何使用raise Exception。
- 14. 说明如何保存异常的错误信息。
- 15. 说明assert的功能。
Python面试题—文件管理
1. 在文件操作时说明with的用法,同时说明with的语法。
在Python可以使用with开启文件,同时with语法区块结束会立刻关闭文件,这样可以省略使用close()
。
with open('filename','mode') as fn:
# 代码区
# 当with语法区块结束,会立刻关闭文件
2. 说明Python的开启文件处理模式(mode)。
- 开启文件有下列3种模式:
- r:只读模式;
- w:写入模式;
- rw:可擦写模式。
- 开启文本文件(text)模式,可以在上述字符末端加上t,不过若是省略t,预设也是开启文本文件模式。
- rt:只读文本文件模式;
- wt:写入文本文件模式;
- rwt:可擦写文本文件模式。
- 开启二进制文件(binary file)模式,可以在字符末端加上b。
- rb:只读二进制文件模式;
- wb:写入二进制文件模式;
- rwb:可擦写二进制文件模式。
- 若是在开启文件末端附加内容,可以使用字符a。
- at:文本文件模式;
- ab:二进制文件模式。
3. 如何删除目前工作夹的文件。
可以使用os.remove(文件名)
或os.unlink(文件名)
。
4. 说明logging的等级。
logging模块共分5个等级,从最低到最高等级顺序如下:
- DEBUG等级:使用
logging.debug()
显示程序日志内容,所显示的内容是程序的小细节,即最低层级的内容,感觉程序有问题时可使用它追踪关键变量的变化过程。 - INFO等级:使用
logging.info()
显示程序日志内容,所显示的内容是记录程序一般发生的事件。 - WARNING等级:使用
logging.warning()
显示程序日志内容,所显示的内容虽然不会影响程序的执行,但是未来可能导致问题发生。 - ERROR等级:使用
logging.error()
显示程序日志内容,通常显示程序在某些状态将引发错误的缘由。 - CRITICAL等级:使用
logging.critical()
显示程序日志内容,这是最重要的等级,通常是显示让整个系统宕掉或中断的错误。
5. send2trash模块。
Python内建的shutil模块在删除文件后就无法复原,而send2trash模块删除文件后可在回收站找到。
import send2trash
send2trash.send2trash('a.txt')
6. 说明是否有模块可以配合Python使用,执行压缩或是解压缩文件或文件夹。
ZipFile模块可以将文件执行压缩以及解压缩,但是无法对文件夹执行压缩以及解压缩。
执行文件压缩前首先要使用ZipFile()
方法建立压缩后的文件名,在这个方法中另外要加上w参数,注明未来是供write()
方法写入。
import zipfile
fileZip = zipfile.ZipFile('zipin.zip','w')
上述fileZip和zipin.zip皆可以自由设定名称,fileZip是压缩文件对象,代表的是zipin.zip,未来将被压缩的文件数据写入此对象,就可以执行将结果存入zipin.zip。ZipFile()
无法执行整个目录的压缩,不过可用循环方式将目录底下的文件压缩,即可达到压缩整个目录的目的。
# 压缩zip文件夹下的所有文件
import zipfile
import glob,os
fileZip = zipfile.ZipFile('zipin.zip','w')
for name in glob.glob('zip/*'):
fileZip.write(name,os.path.basename(name),zipfile.ZIP_DEFLATED)
fileZip.close()
ZipFile对象有namelist()
方法可以回传zip文件内所有被压缩的文件或目录名称,同时以列表方式回传此对象。这个回传的对象可以使用infolist()
方法回传各元素的属性,如文件名filename、文件大小file_size、压缩结果大小compress_size。
import zipfile
listZipInfo = zipfile.ZipFile('zipin.zip','r')
print(listZipInfo.namelist())
for info in listZipInfo.infolist():
print(info.filename,info.file_size,info.compress_size)
解压缩zip文件可以使用extractall()
方法。
import zipfile
fileUnZip = zipfile.ZipFile('zipin.zip')
fileUnZip.extractall('zipout')
fileUnZip.close()
7. 说明如何遍历目录与其子目录。
在os模块内有一个os.walk()
方法可以遍历目录树,这个方法每次执行循环时将回传3个值:
-
目前工作目录名称(dirName);
-
目前工作目录底下的子目录列表(sub_dirName):
-
目前工作目录底下的文件列表(fileNames)。
语法为:
for dirName,sub_dirName,fileNames in os.walk(目录路径):
上述dirName,sub_dirName,fileNames的名称可以自行命名,顺序则不可以更改,可使用os.waik('.')
代表当前工作目录。
# 遍历上述oswalk目录
for dirName,sub_dirNames,fileNames in os.walk('oswalk'):
print('目前工作目录名称: ',dirName)
print('目前子目录名称列表: ',sub_dirNames)
print('目前文件名称列表: ',fileNames,'\n')
"""
目前工作目录名称: oswalk
目前子目录名称列表: ['mydir','mytest']
目前文件名称列表: ['data1.txt']
目前工作目录名称: oswalk\mydir
目前子目录名称列表: ['mysubdir']
目前文件名称列表: ['data2.txt','data3.txt']
目前工作目录名称: oswalk\mydir\mysubdir
目前子目录名称列表: []
目前文件名称列表: ['data6.txt']
目前工作目录名称: oswalk\mytest
目前子目录名称列表: []
目前文件名称列表: ['data4.txt','data5.txt']
"""
8. 说明try...except
的用法,并设计一个除法division()函数,即使除数为0,这个函数也不会异常终止,只是相应None。
try...except
指令的语法格式如下:
try:
指令 # 预先设想可能引发错误异常的指令
except 异常对象: #除数为0的异常对象就是值ZeroDivisionError
异常处理程序 # 通常是指出异常原因,方便修正
上述会执行try:下面的指定,如果正常则逃离except部分,如果指令有异常,则检查此异常是否是异常对象所指的错误,如果是代表异常被被捉了,则执行此异常对象下面的异常处理程序。
下列是除数为0的异常处理,这个程序在除数为0时,仍可以正常执行,不过会输出除数为0的信息,以及输出None。
def division(x,y):
try:
return x/y
except ZeroDivisionError:
print('除数不可为0')
x = eval(input('被除数为:'))
y = eval(input('除数为:'))
print(division(x,y))
"""
被除数为:10
除数为:0
除数不可为0
None
"""
9. 说明FileNotFoundError。
程序设计时常常发生的异常是开启文件时找不到文件,这时会产生FileNotFoundError异常。
下列是开启一个不存在test.txt产生异常的实例,这个程序会有一个异常处理程序,列出文件不存在。如果文件存在则打印文件内容。
fn = 'test.txt'
try:
with open(fn) as file_Obj:
data = file_Obj.read()
except FileNotFoundError:
print("找不到 %s 文件" % fn)
else:
print(data)
10. 说明如何使用一个except捕捉多个异常。
在try...except
的使用中,可以设计多个except捕捉多个异常,此时语法如下:
try:
指令 # 预先设想可能引发错误异常的指定
except 异常对象1: # 如果指令发生异常对象1 执行
异常处理程序1
except 异常对象2: # 如果指令发生异常对象2 执行
异常处理程序2
下列程序设计可以捕捉2个异常对象:
def division(x,y):
try:
return x/y
except ZeroDivisionError:
print('除数不可为0')
except TypeError:
print('使用字符做除法运算异常')
print(division(5,0))
# 除数不可为0
# None
print(division('a','b'))
# 使用字符串做除法运算异常
# None
11. 说明处理异常时,使用Python内建的异常错误信息。
上述实例当发生异常,同时被捕捉时皆是使用自建的异常处理程序,Python也支持发生异常时使用系统内建的异常处理信息。语法格式如下:
try:
指令 # 预先设想可能引发错误异常的指令
except 异常对象 as e: # 使用as e
print(e)
上述e是系统内建的异常处理信息,e可以是任意字符,此处使用e是因为它代表error。当然上述except语法也接受同时处理多个异常对象。
def division(x,y):
try:
return x/y
except (ZeroDivisionError,TypeError) as e:
print(e)
print(division(5,0))
# division by zero
# None
print(division('a','b'))
# unsupported operand type(s) for /: 'str' and 'str'
# None
12. 说明如何捕捉所有异常。
程序设计中许多异常是不可预期的,很难一次设想周到,Python提供了语法可以一次捕捉所有异常,此时try...except
语法如下:
try:
指令 # 预先设想可能引发错误异常的指令
except: # 捕捉所有异常
异常处理程序 # 通常是print输出异常说明
def division(x,y):
try:
return x/y
except:
print('异常发生')
print(division(5,0))
# 异常发生
# None
print(division('a','b'))
# 异常发生
# None
13. 说明如何使用raise Exception。
设计程序时如果发生某些状态,可以将它定义为异常,然后跳出异常信息,程序停止正常往下执行,同时让程序跳到自己设计的except去执行。语法如下:
raise Exception('msg') # 调用Exception, msg是传递错误信息
...
...
try:
指令
except Exception as err: # err是任意取的变量名称,内容是msg
print('message:',str(err)) # 打印错误信息
下列程序检查密码长度是否小于5或者大于8。
def passWord(pwd):
"""检查密码长度必须是5-8之间"""
pwdlen = len(pwd)
if pwdlen < 5:
raise Exception('密码长度不足')
if pwdlen > 8:
raise Exception('密码长度太长')
print('密码长度正确')
for pwd in ('aaabbbccc','aaa','aaabbb'):
try:
passWord(pwd)
except Exception as err:
print('密码长度检查异常发生:',str(err))
# 密码长度检查异常发生:密码长度太长
# 密码长度检查异常发生:密码长度不足
# 密码长度正确
上述当密码太长或不足时都会跳出异常,这时passWord()
函数回传的是Exception对象,这时原先Exception()内的字符串(‘密码长度不足’或者’密码长度太长’)通过except Exception as err
回传给err变量。
14. 说明如何保存异常的错误信息。
执行程序时,若有错误会出现Traceback字符串,这个字符串中会指出程序错误的原因。使用Python时导入traceback模块,就可以使用traceback.format_exc()
记录程序异常的Traceback字符串。
import traceback
def passWord(pwd):
"""检查密码长度必须是5-8之间"""
pwdlen = len(pwd)
if pwdlen < 5:
raise Exception('密码长度不足')
if pwdlen > 8:
raise Exception('密码长度太长')
print('密码长度正确')
for pwd in ('aaabbbccc', 'aaa', 'aaabbb'):
try:
passWord(pwd)
except Exception as err:
errlog = open('errtxt.txt','a')
errlog.write(traceback.format_exc())
errlog.close()
print('写入完成')
print('密码长度检查异常发生:', str(err))
# 写入完成
# 密码长度检查异常发生: 密码长度太长
# 写入完成
# 密码长度检查异常发生: 密码长度不足
# 密码长度正确
15. 说明assert的功能。
断言(assert)的主要功能是确保程序执行到某个阶段,必须符合一定的条件,如果不符合这个条件主动跳出异常,程序终止的同时会主动打印出异常原因,方便程序设计师查错。语法格式为assert cond,'字符串'
。执行到assert时,若条件响应是True,程序不理会后续内容正常往下执行;若条件响应是False,程序终止同时将后续字符串输出到Traceback的字符串内。
class Banks():
title = 'Gongshang Bank'
def __init__(self,uname,money):
self.name = uname
self.balance = money
def save_money(self,money):
assert money > 0,'存款money必须大于0'
self.balance += money
print('存款 ',money,' 完成')
def withdraw_money(self,money):
assert money > 0,'提款money必须大于0'
assert money <= self.balance,'存款金额不足'
self.balance -= money
print('提款 ',money,' 完成')
def get_balance(self):
print(self.name.title(),' 目前金额: ',self.balance)
ex = Banks('abc',100)
ex.get_balance()
ex.save_money(300)
ex.get_balance()
ex.save_money(-300)
ex.get_balance()
"""
Abc 目前金额: 100
存款 300 完成
Abc 目前金额: 400
Traceback (most recent call last):
File "D:/e.py", line 27, in <module>
ex.save_money(-300)
File "D:/e.py", line 9, in save_money
assert money > 0, '存款money必须大于0'
AssertionError: 存款money必须大于0
"""