Python面试题—文件管理
1. 在文件操作时说明with的用法,同时说明with的语法。
? 在Python可以使用with开启文件,同时with语法区块结束会立刻关闭文件,这样可以省略使用close() 。
with open('filename','mode') as fn:
2. 说明Python的开启文件处理模式(mode)。
- 开启文件有下列3种模式:
- 开启文本文件(text)模式,可以在上述字符末端加上t,不过若是省略t,预设也是开启文本文件模式。
- rt:只读文本文件模式;
- wt:写入文本文件模式;
- rwt:可擦写文本文件模式。
- 开启二进制文件(binary file)模式,可以在字符末端加上b。
- rb:只读二进制文件模式;
- wb:写入二进制文件模式;
- rwb:可擦写二进制文件模式。
- 若是在开启文件末端附加内容,可以使用字符a。
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() 无法执行整个目录的压缩,不过可用循环方式将目录底下的文件压缩,即可达到压缩整个目录的目的。
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('.') 代表当前工作目录。
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 异常对象:
异常处理程序
? 上述会执行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
except 异常对象2:
异常处理程序2
? 下列程序设计可以捕捉2个异常对象:
def division(x,y):
try:
return x/y
except ZeroDivisionError:
print('除数不可为0')
except TypeError:
print('使用字符做除法运算异常')
print(division(5,0))
print(division('a','b'))
11. 说明处理异常时,使用Python内建的异常错误信息。
? 上述实例当发生异常,同时被捕捉时皆是使用自建的异常处理程序,Python也支持发生异常时使用系统内建的异常处理信息。语法格式如下:
try:
指令
except 异常对象 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))
print(division('a','b'))
12. 说明如何捕捉所有异常。
? 程序设计中许多异常是不可预期的,很难一次设想周到,Python提供了语法可以一次捕捉所有异常,此时try...except 语法如下:
try:
指令
except:
异常处理程序
def division(x,y):
try:
return x/y
except:
print('异常发生')
print(division(5,0))
print(division('a','b'))
13. 说明如何使用raise Exception。
? 设计程序时如果发生某些状态,可以将它定义为异常,然后跳出异常信息,程序停止正常往下执行,同时让程序跳到自己设计的except去执行。语法如下:
raise Exception('msg')
...
...
try:
指令
except Exception as err:
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
"""
|