天天看點

Python高效程式設計實戰---5、csv json xml excel高效解析與建構技巧

一、如何讀寫csv資料

from urllib import urlretrieve
# urlretrieve('http://finance.yahoo.com/d/quotes.csv?s=000001.sz','pingan1.csv')  # 從網址下載下傳檔案存到檔案中

import csv
with open('pingan1.csv','rb') as rf:  
    reader=csv.reader(rf)   # 傳回一個reader對象,可疊代
    with open('pingan3.csv','wb') as wf:
        writer=csv.writer(wf)  # 傳回一個writer對象
        headers =reader.next()
        writer.writerow(headers)  # 将清單寫入csv檔案的一行 headers為rowdict       
        for rd in reader:
            if rd[]<'2016-01-01':
                continue
            if int(rd[])>:
                writer.writerow(rd)
           

二、如何讀寫json資料

import json

a = ['b', 'a', , {'y': None, 'x': , 'z': 'hello'}]
# separators清單必須前面是',',後面是':',前後可以加空格
# sort_keys設為True可以對清單中字典進行排序
aj = json.dumps(a, sort_keys=False, separators=[',', ':'])
print aj
# ["b", "a", , {"x": , "y": null, "z": "hello"}]   # 此處結果将None轉換為null
print json.loads(aj)
# [u'b', u'a', , {u'y': None, u'x': , u'z': u'hello'}]  # load後,轉換為unicode編碼

print '------------- dump load ------------'
# dump與load是将對象轉換成json串寫入檔案或直接從json檔案中讀取對象
with open('demo.json','wb') as f:
    json.dump(a,f)
with open('demo.json','rb') as f:
    b = json.load(f)
    print b
           

三、如何解析簡單的xml文檔

使用标準庫中的xml.etree.ElementTree,其中的parse函數可以解析xml文檔

from xml.etree.cElementTree import parse
f = open('demo.xml')
et = parse(f)  # 得到一個
root=et.getroot()  # 得到樹的根結點 
           

四、如何建構xml文檔

使用标準庫中的xml.etree.ElementTree,建構ElementTree,使用write方法寫入檔案

import csv
from xml.etree.ElementTree import Element, ElementTree

def pretty(e, level=):  # 格式美化
    if len(e) > :  # 子元素的個數
        e.text = '\n' + '\t' * (level + )  # 如果有子元素的值後面添加回車,在下一行添加制表符
        for child in e:
            pretty(child, level + )  # 遞歸調用
        child.tail = child.tail[:-]  # 下一層循環結束,進入到上一層級格式時,需要減少一人制表符
    e.tail = '\n' + '\t' * level  # 如果元沒有子元素,則在子元素結束符後面添加回車,下一行 添加制表符

# 将csv轉化成xml檔案
def csvToXml(fname):  #
    with open(fname, 'rb') as f:
        reader = csv.reader(f)  # 擷取csv檔案的reader可疊代對象
        headers = reader.next()  # 擷取頭部行
        root = Element('Data')  # 建立根元素
        for row in reader:  # 周遊csv的每一行
            eRow = Element('Row')  # 建立行元素,添加到根元素之下
            root.append(eRow)
            for tag, text in zip(headers, row):  # zip将可疊代元素并列疊代
                el = Element(tag)  # 建立行元素下子元素
                el.text = text
                eRow.append(el)
    pretty(root)  # 格式美化
    return ElementTree(root)

et = csvToXml('pingan3.csv')
et.write('pingan1.xml')
           

五、如何讀寫excel檔案

import xlrd, xlwt

rbook = xlrd.open_workbook('excel.xlsx')  # 打開一個工作簿
rsheet = rbook.sheet_by_name('Sheet1')    # 打開一個工作表

nc = rsheet.ncols
nr = rsheet.nrows

rsheet.put_cell(, nc, xlrd.XL_CELL_TEXT, u'總計', None)  # 對總計列添加字段

for row in xrange(, nr):
    t = sum(rsheet.row_values(row, ))  # row行,從第1個到最後一個值的和
    rsheet.put_cell(row, nc, xlrd.XL_CELL_NUMBER, t, None)  # 對總計列指派

wbook = xlwt.Workbook()  # 建立一個workbook對象
wsheet = wbook.add_sheet(rsheet.name)  # 添加一個sheet表
style = xlwt.easyxf('align:vertical center,horizontal center')  # 定義樣式
for row in xrange(nr):
    for col in xrange(nc+):
        c = rsheet.cell_value(row, col)
        print c
        wsheet.write(row, col, c, style)
wbook.save('excel_bak.xls')   # xlwt 對xlsx格式支援不好,可能會出錯