Python面试题—文件管理

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
"""
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值