Python面试整理(三)

本文详细梳理了Python面试中关于文件操作的问题,包括大数据文件的读取策略、编译和链接过程、异常处理(try-except-else-finally)以及各种文件打开模式的使用。此外,还讨论了自定义异常、使用with语句处理文件的优点,以及如何在Python中查找当前目录、反转文件内容等实用技巧。
摘要由CSDN通过智能技术生成

文件操作

1.大数据的文件读取
  • 读取文件时,如果文件过大,则一次读取全部内容到内存,容易造成内存不足,所以要对大文件进行批量的读取内容。
  • python读取大文件通常两种方法:第一种是利用yield生成器读取;第二种是:利用open()自带方法生成迭代对象,这个是一行一行的读取。
# 利用yield生成器读取
# import random
def read_big_file(file_path, size=1024, encoding='utf-8'):
    with open(file_path, 'r', encoding=encoding) as f:
        while True:
            part = f.read(size)
            if part:
                yield part
            else:
                return None
file_path = 'data/big_data.txt'
size = 100  # 每次读取指定大小的内容到内存,为了测试更加明显,这儿写的小一些
# 注意:以'a'追加模式下,大文件也不会占用太多内存
for part in read_big_file(file_path, size):
    with open('data/new_big_data.txt', 'a', encoding='utf-8') as w:
        w.write(part)
    print(part)
    print('*' * 100)
# 利用open()自带方法生成迭代对象
file_path = 'data/big_data.txt'
new_file_path = 'data/new_big_data.txt'
with open(file_path, 'r', encoding='utf-8') as f:
    for line in f:
        print(line)
        with open(new_file_path, 'a', encoding='utf-8') as a:
            a.write(line)
2.在python中编译和链接的过程是什么?
  • 编译:python中的源代码保存为.py文件,然后将其编译为称为字节码的格式,然后将字节码转换为机器码。编译后,代码存储在.pyc文件中,并在更新源代码时重新生成。此过程称为编译。
  • 链接:链接是最后一个阶段,其中所有功能都与它们的定义链接在一起,因为链接器知道在哪里实现所有这些功能。此过程称为链接。
3.请写一个Python逻辑,计算一个文件中的大写字母数量
with open('xxxx.txt','r') as file:
    count=0
    content=file.read()
    for i in content:
        if i.isupper():
            count+=1
print(count)
4.介绍一下except的用法和作用?
  • 异常处理
    • 捕捉异常可以使用try/except语句
    • try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
    • 如果你不想在异常发生时结束你的程序,只需在try里捕获它。
try:
<语句>        #运行别的代码
except <名字><语句>        #如果在try部份引发了'name'异常
except <名字><数据>:
<语句>        #如果引发了'name'异常,获得附加的数据
else:
<语句>        #如果没有异常发生
5.要打开文件c:\ s.txt进行编写,我们使用:

open(“c:\s.txt”,“w”)

6.何时执行try-except-else的else部分?

当没有异常发生时,执行else部分。

7. 简述with方法打开处理文件帮我我们做了什么?

使用with open()的方式打开文件进行操作,如果在读或写的过程中发生了异常,with 会帮我们close文件。如果用try …
except … finally 方式可以实现同样的效果,在finally中关闭文件。但这样写太麻烦了,不如with open 方便。

8.用python删除文件和用linux命令删除文件方法
  • Linux命令删除(基本格式:rm [选项] 文件或目录)
    (1)-f:强制删除(force),和 -i 选项相反,使用 -f,系统将不再询问,而是直接删除目标文件或目录。
    (2)-i:和 -f 正好相反,在删除文件或目录之前,系统会给出提示信息,使用 -i 可以有效防止不小心删除有用的文件或目录。
    (3)-r:递归删除,主要用于删除目录,可删除指定目录及包含的所有内容,包括所有的子目录和文件。
    • 删除文件:rm -f /文件路径
    • 删除文件夹 :rm -r /文件夹路径
  • Python代码删除
    • os删除文件或者文件夹
    • shutil 删除
import os
os.remove(path)  # path是文件的路径,如果这个路径是一个文件夹,则会抛出OSError的错误,这时需用用rmdir()来删除
os.rmdir(path)  # path是文件夹路径,注意文件夹需要时空的才能被删除
os.unlink('F:\新建文本文档.txt')  #unlink的功能和remove一样是删除一个文件,但是删除一个删除一个正在使用的文件会报错。

import shutil
file_path = '/path'
shutil.rmtree(file_path)
9.写一段自定义异常代码
class TooLongExceptin(Exception):
	"this is user's Exception for check the length of password "
	def __init__(self,leng):
		self.leng = leng
	def __str__(self):
		print("密码长度是"+str(self.leng)+",超过长度了")
10.举例说明异常模块中try except else finally的相关意义
  • try:把可能出现的异常代码放进try中,代表异常处理即将要处理的代码段。
  • except xxx:捕获异常,xxx表示异常类型,如果你大概知道代码会报出什么异常,那么我们可以直接把具体异常类型类型填上。执行过程中,出现了xxx异常,那么该段代码就会执行。
  • else:当try段代码能够正常执行,没有出现异常的情况下,会执行else段代码。
  • finally:不管有没有异常,最终都会执行。
11.r、r+、rb、rb+文件打开模式区别
  • r 操作的是文本文件
  • rb 操作的非文本文件(图片、视频、音频),使用rb模式不用写编码格式
  • r+ 读并追加,必须先读后加,如果先写后读,会对之前的数据进行覆盖,如果覆盖与被覆盖元素的字符码不一样那么就会报错
  • rb+ 读写打开一个二进制文件,允许读写数据,文件必须存在。
12.如何用Python找出你目前在哪个目录?
  • sys.path[0]是调用Python解释器的当前脚本所在的目录。
  • sys.argv[0]是脚本的名字(由系统决定是否是全名)
13.如何以相反顺序展示一个文件的内容?
for line in reversed(open("filename").readlines()): 
	print line.rstrip() 
14.4G 内存怎么读取一个 5G 的数据?

可以通过生成器,分多次读取,每次读取数量相对少的数据(比如 500MB)进行处理,处理结束后在读取后面的 500MB 的数据。

15.Python 中的 os 模块常见方法?
方法名作用
os.getcwd()返回当前工作目录
os.chdir(path)改变工作目录
os.listdir(path)列举指定目录中的文件名和目录名
os.mkdir(path)创建单层目录
os.makedirs(path)递归创建目录
os.remove(path)删除文件
os.rmdir(path)删除单层目录
os.removedirs()递归删除目录
os.system(command)运行系统的shell命令
os.rename(old,new)将老的文件名或目录重新命名为新的文件名或目录
os.curdir代表当前目录
os.pardir代表上一级目录
16.python的read() 、readline()、readlines()
  • 1、read()
    特点:读取整个文件,返回的是一个字符串对象。
    缺点:如果文件非常大,尤其是大于内存时,无法使用read()方法。
  • 2、readline()
    特点:每次读取一行,返回的是一个字符串对象,保持当前行的内存。这种方法读取时占用内存小,比较适合大文件读取。
    缺点:比readlines慢得多。
  • 3、readlines()
    特点:一次性读取整个文件所有行,保存在一个列表(list)变量中,每行作为一个元素。
    缺点:读取大文件会比较占内存。
17.使用代码实现查看列举目录下的所有文件
# 修改工作目录
import os
os.chdir(r'C:\Users\admin\Desktop')
# 定义函数
def list_all_files(rootdir):
    import os
    _files = []
	# 列出文件夹下所有的目录与文件
    list = os.listdir(rootdir)
    for i in range(0, len(list)):
		# 构造路径
        path = os.path.join(rootdir, list[i])
		# 判断路径是否为文件目录或者文件
		# 如果是目录则继续递归
        if os.path.isdir(path):
            _files.extend(list_all_files(path))
        if os.path.isfile(path):
            _files.append(path)
    return _files
# 执行
dir = r'C:\Users\Hider\Desktop\python' # 目录地址
list_all_files(dir)
18.设计实现遍历目录与子目录,抓取.pyc文件
import os
def path(name):
    """
    本次抓取文件使用的是递归调用
    """
    for i in os.listdir(name):  # 遍历文件
        if os.path.isfile(os.path.join(name, i)):  # 判断i是文件还是目录
            if i[-4:] == ".pyc":  # 如果i是文件判断i后四位是否是.pyc文件,如果是输出
                print(os.path.join(i))
        else:
            path(os.path.join(name, i))  # 当i是目录的时候继续调用path
path("./haha")  # 传入文件路径
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值