1. 程式人生 > >《可愛的Python》讀書筆記(七)

《可愛的Python》讀書筆記(七)

configparser ConfigParser

沒有最好,只有更合理!


使用默認的列表打印格式來存儲和匯報實在不咋的,想著修改修改,於是:

# -*- coding: utf-8 -*-
import os


def cdWalker(cdrom, cdcfile):
    export = ""
    for root, dirs, files in os.walk(cdrom):
        print(formatCDinfo(root, dirs, files))
        export += formatCDinfo(root, dirs, files)
    open(cdcfile, 'w').write(export)
    
def formatCDinfo(root, dirs, files):
    export = "\n" + root + "\n"
    for d in dirs:
        export += "-d %s %s \n" % (root, d)
    for f in files:
        export += "-f %s %s \n" % (root, f)
    export += "="*70
    return export

cdWalker('E:\\iso\\CentOS-6.8-x86_64-bin-DVD1','newcd.cdc')

運行結果:

E:\iso\CentOS-6.8-x86_64-bin-DVD1
-d E:\iso\CentOS-6.8-x86_64-bin-DVD1 EFI 
-d E:\iso\CentOS-6.8-x86_64-bin-DVD1 images 
-d E:\iso\CentOS-6.8-x86_64-bin-DVD1 isolinux 
-d E:\iso\CentOS-6.8-x86_64-bin-DVD1 [BOOT] 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1 .discinfo 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1 .treeinfo 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1 CentOS_BuildTag 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1 EULA 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1 GPL 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1 RELEASE-NOTES-en-US.html 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1 RPM-GPG-KEY-CentOS-6 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1 RPM-GPG-KEY-CentOS-Debug-6 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1 RPM-GPG-KEY-CentOS-Security-6 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1 RPM-GPG-KEY-CentOS-Testing-6 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1 TRANS.TBL 
======================================================================
E:\iso\CentOS-6.8-x86_64-bin-DVD1\EFI
-d E:\iso\CentOS-6.8-x86_64-bin-DVD1\EFI BOOT 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\EFI TRANS.TBL 
======================================================================
E:\iso\CentOS-6.8-x86_64-bin-DVD1\EFI\BOOT
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\EFI\BOOT BOOTX64.conf 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\EFI\BOOT BOOTX64.efi 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\EFI\BOOT splash.xpm.gz 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\EFI\BOOT TRANS.TBL 
======================================================================
E:\iso\CentOS-6.8-x86_64-bin-DVD1\images
-d E:\iso\CentOS-6.8-x86_64-bin-DVD1\images pxeboot 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\images efiboot.img 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\images efidisk.img 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\images install.img 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\images TRANS.TBL 
======================================================================
E:\iso\CentOS-6.8-x86_64-bin-DVD1\images\pxeboot
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\images\pxeboot initrd.img 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\images\pxeboot TRANS.TBL 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\images\pxeboot vmlinuz 
======================================================================
E:\iso\CentOS-6.8-x86_64-bin-DVD1\isolinux
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\isolinux boot.cat 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\isolinux boot.msg 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\isolinux grub.conf 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\isolinux initrd.img 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\isolinux isolinux.bin 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\isolinux isolinux.cfg 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\isolinux memtest 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\isolinux splash.jpg 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\isolinux TRANS.TBL 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\isolinux vesamenu.c32 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\isolinux vmlinuz 
======================================================================
E:\iso\CentOS-6.8-x86_64-bin-DVD1\[BOOT]
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\[BOOT] 1-Boot-NoEmul.img 
-f E:\iso\CentOS-6.8-x86_64-bin-DVD1\[BOOT] 2-Boot-NoEmul.img 
======================================================================

其中 d 代表目錄;f 代表文件。

雖然是自個兒隨意設計的格式,但是小白可以體會出以下好處:

1.格式自然,可以直接人工查閱;

2.每行包含對象類型(目錄或文件)所在目錄和文件名;

3.搜索匹配後的輸出行就是自然行,並包含必要信息;


記錄的摘要文本可以再進行升級,參考標準的.ini配置文件格式,改動是不可避免的,那麽有2個問題:

  1. 如何處理.ini文件

  2. 如何獲得文件大小


在行者的指導下快速嘗鮮一下:

>>> from configparser import RawConfigParser as rcp
>>> cfg=rcp()
>>> cfg.add_section('Info')
>>> cfg.set("Info", "ImagePath", "path/to/my/cd")
>>> cfg.set("Info","foo","cd")
>>> cfg.write(open("try.ini","w"))

查看文件try.ini

[Info]
imagepath = path/to/my/cd
foo = cd


>>> import os
>>> os.stat("try.ini")
os.stat_result(st_mode=33206, st_ino=844424930848802, st_dev=1492519019, st_nlin
k=1, st_uid=0, st_gid=0, st_size=47, st_atime=1521902211, st_mtime=1521902211, s
t_ctime=1521902211)
>>> os.stat("try.ini").st_size
47

Bingo! 就它了!

利用基礎配置處理機模塊,將原先os.walk()生成的信息組織成類 ini 的文本保存下來。


# -*- coding: utf-8 -*-
import os
from configparser import RawConfigParser as rcp


def iniCDinfo(cdrom, cdcfile):

    walker = {}
    for root, dirs, files in os.walk(cdrom):
        walker[root] = (dirs, files)            # 根目錄為字典的key,對應子目錄加文件作為value
    cfg = rcp()
    cfg.add_section("Info")
    cfg.add_section("Comment")
    cfg.set("Info", "ImagePath", cdrom)
    cfg.set("Info", "Volume", cdcfile)
    dirs = walker.keys()
    i = 0
    for d in dirs:
        i += 1
        cfg.set("Comment", str(i), d)
    for p in walker:
        cfg.add_section(p)
        for f in walker[p][1]:
            cfg.set(p, f, os.stat("%s/%s" % (p, f)).st_size)
    cfg.write(open(cdcfile, "w"))

iniCDinfo('E:\\iso\\CentOS-6.8-x86_64-bin-DVD1','newcd.ini')

查看newcd.ini文件內容:

[Info]
imagepath = E:\iso\CentOS-6.8-x86_64-bin-DVD1
volume = newcd.cdc

[Comment]
1 = E:\iso\CentOS-6.8-x86_64-bin-DVD1
2 = E:\iso\CentOS-6.8-x86_64-bin-DVD1\EFI
3 = E:\iso\CentOS-6.8-x86_64-bin-DVD1\EFI\BOOT
4 = E:\iso\CentOS-6.8-x86_64-bin-DVD1\images
5 = E:\iso\CentOS-6.8-x86_64-bin-DVD1\images\pxeboot
6 = E:\iso\CentOS-6.8-x86_64-bin-DVD1\isolinux
7 = E:\iso\CentOS-6.8-x86_64-bin-DVD1\[BOOT]

[E:\iso\CentOS-6.8-x86_64-bin-DVD1]
.discinfo = 31
.treeinfo = 338
centos_buildtag = 14
eula = 212
gpl = 18009
release-notes-en-us.html = 1359
rpm-gpg-key-centos-6 = 1706
rpm-gpg-key-centos-debug-6 = 1730
rpm-gpg-key-centos-security-6 = 1730
rpm-gpg-key-centos-testing-6 = 1734
trans.tbl = 3380

[E:\iso\CentOS-6.8-x86_64-bin-DVD1\EFI]
trans.tbl = 216

[E:\iso\CentOS-6.8-x86_64-bin-DVD1\EFI\BOOT]
bootx64.conf = 398
bootx64.efi = 254279
splash.xpm.gz = 1341
trans.tbl = 672

[E:\iso\CentOS-6.8-x86_64-bin-DVD1\images]
efiboot.img = 380928
efidisk.img = 45373440
install.img = 146313216
trans.tbl = 888

[E:\iso\CentOS-6.8-x86_64-bin-DVD1\images\pxeboot]
initrd.img = 40688737
trans.tbl = 441
vmlinuz = 4264528

[E:\iso\CentOS-6.8-x86_64-bin-DVD1\isolinux]
boot.cat = 2048
boot.msg = 84
grub.conf = 321
initrd.img = 40688737
isolinux.bin = 24576
isolinux.cfg = 923
memtest = 183012
splash.jpg = 151230
trans.tbl = 2215
vesamenu.c32 = 163728
vmlinuz = 4264528

[E:\iso\CentOS-6.8-x86_64-bin-DVD1\[BOOT]]
1-boot-noemul.img = 2048
2-boot-noemul.img = 380928

[Info] 一節是軟件和光盤的整體信息;[Comment] 一節是根目錄列表;[目錄] 各節是各個目錄的文件信息


總結:通過自發的反省,對比了數據結構的優劣,不斷改進,選擇了最容易理解且跨平臺通用的數據格式,照例在行者提醒後發覺並使用內建模塊ConfigParser來進行數據文本的組織和解讀。

《可愛的Python》讀書筆記(七)