前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 小组学习 Week3-Task3

Python 小组学习 Week3-Task3

作者头像
子乾建建-Jeff
发布2020-06-29 15:11:15
1.7K0
发布2020-06-29 15:11:15
举报
文章被收录于专栏:iBroProiBroPro

Python 基础知识(二)

针对本周的学习主题,如果单纯来写这些知识点,自己没有细致的看书,没有无异化的见解,不对概念性东西照搬了。总结一些这几天看的面试题目,题目中无形中包含了这些基础知识点。

- 函数、类、模块

- 文件读写

- 异常处理

00

读取 XML 节点和属性值

Q:在 files 目录下有一个 product.xml 文件,要求读取该文件中 products 节点的所有子节点的值以及子节点的属性值。

代码语言:javascript
复制
<!-- 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 方法。

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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__。

代码语言:javascript
复制
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 小于第一行的总字符数,只读取第一行。

代码语言:javascript
复制
# 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:

代码语言:javascript
复制
'''
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__ 方法。

代码语言:javascript
复制
'''
__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 学院,亲手书写,侵删

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 iBroPro 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档