Python处理常用结构化文本文件

Python数据格式处理
本文介绍了Python中处理CSV、XML、JSON等数据格式的方法,并演示了如何使用pickle进行数据序列化,还包括了配置文件的读取。

《Python语言及其应用》的学习笔记

1. CSV

写入CSV文件

import csv

alphabet = [
  ('Char', 'No'),
  ('a', 1),
  ('b', 2),
  ('c', 3),
]

# 如果写入的文件出现多个空行,则在打开文件时,设置newline为空(newline='')
with open('alphabet.csv', 'wt', encoding='utf-8', newline='') as fout:
  csvout = csv.writer(fout)
  csvout.writerows(alphabet)
复制代码

读取CSV文件

with open('alphabet.csv', 'rt', encoding='utf-8') as fin:
    cin = csv.reader(fin)
    alphabet = [row for row in cin]

print(alphabet) # [['Char', 'No'], ['a', '1'], ['b', '2'], ['c', '3']]
复制代码

使用DictWriterDictReader

import csv

alphabet = [
  {'Char': 'a', 'No': 1},
  {'Char': 'b', 'No': 2},
  {'Char': 'c', 'No': 3}
]

with open('alphabet.csv', 'wt', encoding='utf-8', newline='') as fout:
  csvout = csv.DictWriter(fout, ['Char', 'No'])
  csvout.writeheader()
  csvout.writerows(alphabet)

with open('alphabet.csv', 'rt', encoding='utf-8') as fin:
    cin = csv.DictReader(fin)
    alphabet = [dict(row) for row in cin]

print(alphabet) # [{'Char': 'a', 'No': '1'}, {'Char': 'b', 'No': '2'}, {'Char': 'c', 'No': '3'}]
复制代码

2. XML

通常用于数据传送和消息, 如RSS和Atom

<?xml version="1.0" encoding="utf-8" ?>
<menu>
  <breakfast hours="7-11">
    <item price="$6.00">breakfast burritos</item>
    <item price="$4.00">pancakes</item>
  </breakfast>
  <lunch hours="11-3">
    <item price="$5.00">hamburger</item>
  </lunch>
  <dinner hours="3-10">
    <item price="8.00">spaghetti</item>
  </dinner>
</menu>
复制代码

使用ElementTree解析xml文件

import xml.etree.ElementTree as et

tree = et.ElementTree(file='menu.xml')
root = tree.getroot()

print(root.tag) # menu

for child in root:
    print(child.tag, child.attrib)
    for grandchild in child:
        print('\t', grandchild.tag, grandchild.attrib)
# breakfast {'hours': '7-11'}
# 	 item {'price': '$6.00'}
# 	 item {'price': '$4.00'}
# lunch {'hours': '11-3'}
# 	 item {'price': '$5.00'}
# dinner {'hours': '3-10'}
# 	 item {'price': '8.00'}

print(len(root))    # 3

print(len(root[0]))  # 2
复制代码

3. JSON

  • 使用json.dumps()编码成JSON字符串
  • 使用json.loads()JSON字符串解析成Python数据结构
import json
from datetime import datetime

now = datetime.utcnow()
json.dumps(now)
# 报错TypeError: Object of type 'datetime' is not JSON serializable

# 需要将datetime转换成JSON能够理解的类型,如str或epoch
now_str = str(now)
json.dumps(now_str)
复制代码

通过继承和修改JSON的编码方式,使其支持datetime

import json
from datetime import datetime
from time import mktime

now = datetime.utcnow()

class DTEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, datetime):
            return int(mktime(o.timetuple()))
        return json.JSONEncoder.default(self, o)

json.dumps(now, cls=DTEncoder)
复制代码

4. 配置文件

settings.cfg配置文件

[english]
greeting = Hello

[french]
greeting = Bonjour

[files]
home = /usr/local

# 简单的插入
bin = %(home)s/bin
复制代码

使用configparser读取配置文件

import configparser
cfg = configparser.ConfigParser()
cfg.read('settings.cfg', encoding='utf-8')

print(cfg['french']['greeting'])    # Bonjour
print(cfg['files']['bin'])  # /usr/local/bin
复制代码

5. 使用pickle序列化

pickle是以特殊的二进制格式保存和恢复数据的

import pickle
from datetime import datetime

now = datetime.utcnow()

now_pickled = pickle.dumps(now) # b'\x80\x03cdatetime\ndatetime\nq\x00C\n\x07\xe2\x03\x10\x034)\x00\xca_q\x01\x85q\x02Rq\x03.'
now2 = pickle.loads(now_pickled)  # 2018-03-16 03:52:41.051807
复制代码

转载于:https://juejin.im/post/5aab41d9518825556d0ddb02

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值