Python 基础知识(二)
针对本周的学习主题,如果单纯来写这些知识点,自己没有细致的看书,没有无异化的见解,不对概念性东西照搬了。总结一些这几天看的面试题目,题目中无形中包含了这些基础知识点。
- 函数、类、模块
- 文件读写
- 异常处理
00
读取 XML 节点和属性值
Q:在 files 目录下有一个 product.xml 文件,要求读取该文件中 products 节点的所有子节点的值以及子节点的属性值。
<!-- product.xml -->
<root>
<products>
<product uuid='1234'>
<id>10000</id>
<name>iPhone9</name>
<price>9999</price>
</product>
<product uuid='4321'>
<id>20000</id>
<name>特斯拉</name>
<price>9999000</price>
</product>
<product uuid='5678'>
<id>30000</id>
<name>MBP</name>
<price>19999</price>
</product>
</products>
</root>
A:思路分析
通过 parse 函数可以读取 XML 文档,该函数返回 ElementTree 类型的对象,通过该对象的 iterfind 方法可以对 XML 中特定节点进行迭代。
获取属性值使用 get 方法,以及获取子节点的值可以通过 findtext 方法。
from xml.etree.cElementTree import parse
doc = parse('files/product.xml')
print(type(doc))
for item in doc.iterfind('products/product'):
id = item.findtext('id')
name = item.findtext('name')
price = item.findtext('price')
uuid = item.get('uuid') # 属性值通过 get 方法获取值
print('uuid=',uuid)
print('id=',id)
print('name=',name)
print('price=',price)
01
XML 与字典之间的互转
Q:如何将一个字典转换为 XML 文档,并将该 XML 文档保存成文本文件
A:思路解析
导入包 dicttoxml
import dicttoxml
import os
from xml.dom.minidom import parseString
d = [20,'names',{'name':'Bill','age':30,'salary':2000},
{'name':'Mike','age':40,'salary':3000},
{'name':'John','age':20,'salary':1000}]
bxml = dicttoxml.dicttoxml(d,custom_root='persons')
xml = bxml.decode('utf-8')
print(xml)
dom = parseString(xml)
prettyxml = dom.toprettyxml(indent=' ')
print(prettyxml)
f = open('files/persons1.xml','w',encoding='utf-8')
f.write(prettyxml)
f.close()
Q:如何读取 XML 文件的内容,并将其转换为字典
A:思路解析
导入 xmltodict
import xmltodict
import pprint
f = open('files/product.xml','rt',encoding='utf-8')
xml = f.read()
d = xmltodict.parse(xml)
print(d) # 排完序的一个字典
pp = pprint.PrettyPrinter(indent=1)
pp.pprint(d)
02
将 JSON 字符串转换为类的实例
Q:如何将一个 JSON 文档映射为对象
A:思路解析
json 模块的 loads 函数可以装在 JSON 文档,并将其转换为 JSON 对象。
关键需要通过 loads 函数的 object_hook 参数指定钩子对象,然后在类的构造方法中将传入的 JSON 对象赋给内部变量 __dict__。
import json
class Product:
def __init__(self,d):
self.__dict__ = d # 利用__dict__,将字典中的key自动映射为属性名
f = open('files/product.json','r')
jsonStr = f.read()
print(jsonStr) # 字符串
# 通过指定类直接转换
product = json.loads(jsonStr,object_hook=Product)
print(type(product)) # <class '__main__.Product'>
print(product.name) #iPhone9
# 指定一个转换函数
def json2Product(d):
return Product(d)
product1 = json.loads(jsonStr,object_hook=json2Product)
print(product1.name) # iPhone9
print(type(product1)) # <class '__main__.Product'>
03
read、readline、readlines 的区别
Q:使用 open 函数打开文件,并返回一个 IO 对象,该对象有 3 个用于读取文件的方法:read、readline、readlines。请用代码描述这 3 个方法的区别
A:
read:默认读取全部内容。
指定参数 n 时,读取指定的前 n 个字符
readline:默认读取第一行
指定参数 n 时,读取当前行的前 n 个字符。若 n 比当前行字符总数少,读前 n 个;若 n 比当前行字符总数多,也只是读取完该行就停止了。
readlines:默认读取了所有元素,返回得到一个列表,每一行是列表中的一个元素。
指定参数 n 时,只会读取总字符个数大于 n 的行。若 n 小于第一行的总字符数,只读取第一行。
# read(n) 读取指定的参数 n 个字符
print('2:',f.read(3))
f.seek(6) # 引导到指定位置
print(f.read(2))
f.close()
# readline
# 读取一行
# 当前行的前 n 个字符。若 n 比当前行字符个数小,读取前 n 个字符;若大于当前行字符个数,最多读取当前行
f = open('files/readme.txt','r')
# print(f.readline())
print(f.readline(5))
# readlines
f = open('files/readme.txt','r')
print(f.readlines()) # 将每一行当作一个列表元素
# print(f.readlines(12
04
请使用代码描述 with 语句的作用
Q:with 语句有什么作用,请用代码解释
A:
'''
with 语句适用于对资源进行访问的场合,确保不管使用过程是否发生异常都会执行必要的"清理"工作
未使用 try 和 with 时,易出问题:
a.未关闭文件
b.即使关闭了文件,但如果在关闭之前抛出异常,仍然无法关闭文件
'''
f = open('files/readme.txt','r')
try:
data = f.read()
except:
print('有异常')
finally:
f.close()
# 自动处理异常/自动关闭文件
with open('files/readme.txt','r') as f:
data = f.read()
print(data)
Q:如何将 with 语句用于一个自定义类
A:思路解析
需要实现 __enter__ 和 __exit__ 方法。
'''
__enter__
__exit__
'''
class MyClass:
def __enter__(self):
print('__enter__ is called')
return self
def process1(self):
print('process1')
def process2(self):
a = 2/0
print('process2')
def __exit__(self, exc_type, exc_val, traceback):
print('__exit__() is called')
print(f'type:{exc_type}')
print(f'value:{exc_val}')
print(f'trace:{traceback}')
with MyClass() as my:
my.process1()
my.process2() # 函数中存在一个异常
# 当有异常产生时, __exit__ 函数中的值就会有值,不再是None
'''
type:<class 'ZeroDivisionError'>
value:division by zero
trace:<traceback object at 0x10de78500>
'''
完
注:参考自 CSDN 学院,亲手书写,侵删