本文目录一览:
如何用Python输出漂亮的xml文件
最近要用Python处理一个xml文件。平时习惯了用xml.etree.ElementTree,结果发现此库存在一些让人无法忍受的缺点:
1. 无法处理comment和cdata
2. 输出后的xml文件没有换行,没有缩进,十分难以阅读
于是尝试这用xml.dom.minidom,前两个问题几乎全部解决了。唯一让人看着不爽的是minidom对于text的处理。比如,我期待的xml输入如下:
[html] view plain copy
pre name="code" class="html"pre name="code" class="html"root
host192.168.0.1/host
/root
但是使用xml.dom.minidom.Document.writexml后,输出的结果却是这样的:
[html] view plain copy
root
host
192.168.0.1
/host
/root
开始的时候,我考虑重写Document.writexml函数,觉得太麻烦,有用牛刀杀鸡之感。后来想想,其实自己的需求非常简单,只是需要对Document的输出结果做个二次处理即可。使用python的正则表达式库就可以实现:
[python] view plain copy
def save_xml(self, file_name):
xml_str = self.m_dom.toprettyxml(indent=" ")
repl = lambda x: "%s/" % x.group(1).strip() if len(x.group(1).strip()) != 0 else x.group(0)
pretty_str = re.sub(r'\n\s*([^]+)/', repl, xml_str)
open(file_name, 'w').write(pretty_str)
先将Document输出到字符串,然后使用正则表达式将text中的空行去掉即可。
黑马程序员的PYthon是国内最早开设的真正人工智能课程。课程全面系统,紧跟时代潮流。
python解析CData
亲,python爬虫的解析框架的我也把握不准,我都是用re里面的正则表达式的匹配
myItems = re.findall('a class="breadInfo" href="board.jsp(.*?)/a',unicodePage,re.S)
myItems里面的内容是(.*?)所匹配到的,如果你的这个what,thefuck,你可以写成myItems = re.findall('!CDATA[[d(。*?)/d]],所以for i in myItems :
print i 就会得到What,the fuck!
python3.0怎么用json从文件解析
1、说明:
python3通过json模块load函数来解析文件。
2、代码示例:
首先编写一个json文件j.txt,内容如下:
{"errno":1,"errmsg":"操作成功!","data":[]}
python代码如下:
import json
with open('j.txt', 'r') as fr:
o = json.load(fr)
print(o['errno'])
print(o['errmsg'])
print(len(o['data']))
输出如下:
1
操作成功!
3、函数说明:
load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
反序列化fp(一个.read()包含 - 支持类文件对象一个JSON文件),以一个Python对象。
object_hook是将与被调用的可选功能任何对象文本解码(一个``dict``)的结果。返回值object_hook将用来代替dict。此功能可用于实现自定义解码器(例如JSON-RPC级提示)。
object_pairs_hook是将与被调用的可选功能任何对象的结果与对的有序列表字面解码。该的返回值object_pairs_hook将用来代替dict。
此功能可用于实现依赖于定制解码器命令该键和值对被解码(例如,collections.OrderedDict会记得插入的顺序)。如果object_hook也定义了object_pairs_hook优先。
要使用自定义JSONDecoder子类,与cls指定它kwarg;否则JSONDecoder使用。
4、其它说明:
也可以使用json.loads函数来直接处理字符串,方法如下:
o=json.loads('{"errno":0,"errmsg":"操作成功!","data":[]}')
求助:python如何按位解析二进制数据
可以的,二进制是计算机内的表示方法,处理二进制数据是最基本的能力。
如果是二进制字符串转十进制:
x = '10101010'
int(x, 2)
170
如果是从文件或网络中获取的数据,要知道某一位是0还是1的话,获取的数据可以按字符读取,由于一个字符由8位二进制表示,分别读取1到8位的二进制值就可以了:
get_char_bit = lambda char, n: (char (8-n)) 1 # 从高到低分别为第1~8位
data = b'ab' # 在python3中字符串默认是unicode,所以加上b前缀兼容
# 在python3中按字符读取byte字符串是数字,而python2读出来的却是字符,但bytearray是一致的都是数字
data = bytearray(data)
result = []
for char in data:
for i in range(1, 9):
result.append(get_char_bit(char, i))
result
[0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0]
还有一种比较简单的方法是使用内置的bin函数
data = bytearray(b'ab')
result = []
for char in data:
result.extend(bin(char)[2:].rjust(8, '0'))
result
['0', '1', '1', '0', '0', '0', '0', '1', '0', '1', '1', '0', '0', '0', '1', '0']