Ⅰ 114 11 個案例掌握 python 數據可視化--美國氣候研究
自哥本哈根氣候會議之後,全球日益關注氣候變化和溫室效應等問題,並於會後建立了全球碳交易市場,分階段分批次減碳。本實驗獲取了美國 1979 - 2011 年間 NASA 等機構對美國各地日均最高氣溫、降雨量等數據,研究及可視化了氣候相關指標的變化規律及相互關系。
輸入並執行魔法命令 %matplotlib inline, 並去除圖例邊框。
數據集介紹:
本數據集特徵包括美國 49 個州(State),各州所在的地區(Region),統計年(Year),統計月(Month),平均光照(Avg Daily Sunlight),日均最大空氣溫度(Avg Daily Max Air Temperature ),日均最大熱指數(Avg Daily Max Heat Index ),日均降雨量(Avg Daily Precipitation ),日均地表溫度(Avg Day Land Surface Temperature)。
各特徵的年度區間為:
導入數據並查看前 5 行。
篩選美國各大區域的主要氣候指數,通過 sns.distplot 介面繪制指數的分布圖。
從運行結果可知:
光照能量密度(Sunlight),美國全境各地區分布趨勢大致相同,均存在較為明顯的兩個峰(強光照和弱光照)。這是因為非赤道國家受地球公轉影響,四季光照強度會呈現出一定的周期變化規律;
從地理區位能看出,東北部光照低谷明顯低於其他三個區域;
日均最高空氣溫度(Max Air Temperature),美國全境各地區表現出較大差異,東北部和中西部趨勢大致相同,氣溫平緩期較長,且包含一個顯著的尖峰;西部地區平緩期最長,全年最高溫均相對穩定;南部分布則相對更為集中;
日均地表溫度(Land Surface Temperature),與最高空氣溫度類似,不同之處在於其低溫區分布更少;
最大熱指數(Max Heat Index),西部與中西部分布較為一致,偏溫和性溫度,東北部熱指數偏高,南部偏低;
降雨量(Precipitation),西部明顯偏小,南部與東北部大致相同,中西部相對較多。
結合地理知識做一個總結:
東北部及大多數中西部地區,屬於溫帶大陸性氣候,四季分明,夏季悶熱,降雨較多。
西部屬於溫帶地中海氣候,全年氣候溫和,並且乾燥少雨,夏季氣候溫和,最高溫度相對穩定。
南部沿海一帶,終年氣候溫暖,夏季炎熱,雨水充沛。
按月計算美國各地區降雨量均值及標准偏差,以均值 ± 一倍標准偏差繪制各地區降雨量誤差線圖。
從運行結果可知:
在大多數夏季月份,西部地區降雨量遠小於其他地區;
西部地區冬季月降雨量高於夏季月;
中西部地區是較為典型的溫帶大陸性氣候,秋冬降雨逐漸減少,春夏降雨逐漸升高;
南部地區偏向海洋性氣候,全年降雨量相對平均。
需要安裝joypy包。
日均最高氣溫變化趨勢
通過 joypy 包的 joyplot 介面,可以繪制帶堆積效應的直方分布曲線,將 1980 年 - 2008 年的日均最高溫度按每隔 4 年的方式繪制其分布圖,並標注 25%、75% 分位數。
從運行結果可知:
1980 - 2008 年區間,美國全境日均最高溫度分布的低溫區正逐漸升高,同時高溫區正逐漸降低,分布更趨向於集中;
1980 - 2008 年區間,美國全境日均最高溫度的 25% 分位數和 75% 分位數有少量偏離但並不明顯。
日均降雨量變化趨勢
同樣的方式對降雨量數據進行處理並查看輸出結果。
篩選出加州和紐約州的日均降雨量數據,通過 plt.hist 介面繪制降雨量各月的分布圖。
從運行結果可知:
加州地區降雨量多集中在 0 - 1 mm 區間,很少出現大雨,相比而言,紐約州則顯得雨量充沛,日均降雨量分布在 2 - 4 mm 區間。
直方圖在堆積效應下會被覆蓋大多數細節,同時表達聚合、離散效應的箱線圖在此類問題上或許是更好的選擇。
通過 sns.boxplot 介面繪制加州和紐約州全年各月降雨量分布箱線圖.
從箱線圖上,我們可以清晰地對比每個月兩個州的降雨量分布,既可以看到集中程度,例如七月的加州降雨量集中在 0.1 - 0.5 mm 的窄區間,說明此時很少會有大雨;又可以看到離散情況,例如一月的加州,箱線圖箱子(box)部分分布較寬,且上方 10 mm 左右存在一個離散點,說明此時的加州可能偶爾地會出現大到暴雨。
視覺上更為美觀且簡約的是擺動的誤差線圖,實驗 「美國全境降雨量月度分布」 將所有類別標簽的 x 位置均放於同一處,導致誤差線高度重合。可通過調節 x 坐標位置將需要對比的序列緊湊排布。
從輸出結果可以看出,加州冬季的降雨量不確定更強,每年的的十一月至次年的三月,存在降雨量大,且降雨量存在忽多忽少的現象(誤差線長)。
上面的實驗均在研究單變數的分布,但經常性地,我們希望知道任意兩個變數的聯合分布有怎樣的特徵。
核密度估計 , 是研究此類問題的主要方式之一, sns.kdeplot 介面通過高斯核函數計算兩變數的核密度函數並以等高線的形式繪制核密度。
從運行結果可知:
加州在高溫區和低降雨期存在一個較為明顯的高密度分布區(高溫少雨的夏季);
紐約州在高溫及低溫區均存在一個高密度的分布區,且在不同溫區降雨量分布都較為均勻。
將美國全境的降雨量與空氣溫度通過 plt.hist2d 介面可視化。
從運行結果可知:
美國全境最高密度的日均高溫溫度區域和降雨量區間分別為,78 F (約等於 25 C)和 2.2 mm 左右,屬於相對舒適的生活氣候區間。
美國全境降雨量與空氣溫度的關系-核密度估計
在上面實驗基礎上,在 x, y 軸上分別通過 sns.rugplot 介面繪制核密度估計的一維分布圖,可在一張繪圖平面上同時獲取聯合分布和單變數分布的特徵。
美國全境降雨量與空氣溫度的關系-散點分布和直方分布
sns.jointplot 介面通過柵格的形式,將單變數分布用子圖的形式進行分別繪制,同時通過散點圖進行雙變數關系的展示,也是一種較好的展現數據分布的方式。
上面兩個實驗研究了雙變數分布的可視化,以下研究 3 變數聚合結果的可視化。
通過 sns.heatmap 介面可實現對透視數據的可視化,其原理是對透視結果的值賦予不同的顏色塊,以可視化其值的大小,並通過顏色條工具量化其值大小。
上面的兩個實驗可視化了各州隨年份日均最高溫度的中位數變化趨勢,從圖中並未看出有較為顯著地變化。
以下通過 t 檢驗的方式查看統計量是否有顯著性差異。stats.ttest_ind 介面可以輸出 1980 年 與 2010 年主要氣候指數的顯著性檢驗統計量及 p 值。
從運行結果可以看出:
檢驗結果拒絕了降雨量相等的原假設,即 1980 年 與 2010 年兩年間,美國降雨量是不同的,同時沒有拒絕日均日照、日均最大氣溫兩個變數相等的原假設,說明氣溫未發生顯著性變化。
Ⅱ python正則表達式使用實例有哪些
具體如下:
1、測試正則表達式是否匹配字元串的全部或部分regex=ur"" #正則表達式:if re.search(regex, subject): do_something()else: do_anotherthing() 。
2、測試正則表達式是否匹配整個字元串 regex=ur"/Z" #正則表達式末尾以/Z結束:if re.match(regex, subject): do_something()else: do_anotherthing() 。
3、創建一個匹配對象,然後通過該對象獲得匹配細節(Create an object with details about how the regex matches (part of) a string) regex=ur"" #正則表達式:
match = re.search(regex, subject)if match: # match start: match.start() # match end (exclusive): atch.end() # matched text: match.group() do_something()else: do_anotherthing()。
4、獲取正則表達式所匹配的子串(Get the part of a string matched by the regex) regex=ur"" #正則表達式:match = re.search(regex, subject)if match: result = match.group()else: result ="" 。
5、獲取捕獲組所匹配的子串(Get the part of a string matched by a capturing group) regex=ur"" #正則表達式:match = re.search(regex, subject)if match: result = match.group(1)else: result ="" 。
Ⅲ 如何以Python代碼實例展示kNN演算法的實際運用
給樣本數據集T={2,4,10,12,3,20,22,21,11,24} t={18},K=4 1. N={2,4,10,12},d1=16,d2=14,d3=8,d4=6 2.d={3},比較,N={4,10,12,3},d1=14,d2=8,d3=6,d4=15 3.d={20},比較,N={4,10,12,20},d1=14,d2=8,d3=6,d4=2 4.d={22},比較,N={10,12,20,22},
Ⅳ Python一般可以用來干什麼呢
Python實際上是一種編程語言,在許多領域中都有廣泛的應用,例如最熱門的大數據分析,人工智慧,Web開發等。
1989年聖誕節,阿姆斯特丹,為了度過無聊的聖誕節,年輕人Guido決定開發一種新的編程語言。 Python(Boa Constrictor)的名字是因為他是Monty Python喜劇小組的粉絲。你看,技術是如此隨意...
Ⅳ Python程序開發之簡單小程序實例(11)小游戲-跳動的小球
Python程序開發之簡單小程序實例
(11)小 游戲 -跳動的小球
一、項目功能
用戶控制擋板來阻擋跳動的小球。
二、項目分析
根據項目功能自定義兩個類,一個用於控制小球在窗體中的運動,一個用於接收用戶按下左右鍵時,擋板在窗體中的運動。在控制小球的類中,我們還需要考慮當小球下降時,碰到擋板時的位置判斷。
三、程序源代碼
源碼部分截圖:
源碼:
#!/usr/bin/python3.6
# -*- coding: GBK -*-
#導入相應模塊
from tkinter import *
import random
import time
#自定義小球的類 Ball
class Ball:
# 初始化
def __init__(self,canvas,paddle,color):
#傳遞畫布值
self.canvas=canvas
#傳遞擋板值
self.paddle=paddle
#畫圓並且保存其ID
self.id=canvas.create_oval(10,10,25,25,fill=color)
self.canvas.move(self.id,245,100)
#小球的水平位置起始列表
start=[-3,-2,-1,1,2,3]
#隨機化位置列表
random.shuffle(start)
self.x=start[0]
self.y=-2
self.canvas_heigh=self.canvas.winfo_height()#獲取窗口高度並保存
self.canvas_width=self.canvas.winfo_width()
#根據參數值繪制小球
def draw(self):
self.canvas.move(self.id,self.x,self.y)
pos=self.canvas.coords(self.id)#返回相應ID代表的圖形的當前坐標(左上角和右上角坐標)
#使得小球不會超出窗口
pad=self.canvas.coords(self.paddle.id)#獲取小球擋板的坐標
if pos[1]=self.canvas_heigh or(pos[3]>=pad[1] and pos[2]>=pad[0] and pos[2]
Ⅵ python軟體開發的案例有哪些,可用於哪些開發
列舉一些比較有名的網站或應用。這其中有一些是用python進行開發,有一些在部分業務或功能上使用到了python,還有的是支持python作為擴展腳本語言。數據大部分來自Wikepedia和Quora。
Reddit - 社交分享網站,最早用Lisp開發,在2005年轉為python
Dropbox - 文件分享服務
豆瓣網 - 圖書、唱片、電影等文化產品的資料資料庫網站
Django - 鼓勵快速開發的Web應用框架
Fabric - 用於管理成百上千台Linux主機的程序庫
EVE - 網路游戲EVE大量使用Python進行開發
Blender - 以C與Python開發的開源3D繪圖軟體
BitTorrent - bt下載軟體客戶端
Ubuntu Software Center - Ubuntu 9.10版本後自帶的圖形化包管理器
YUM - 用於RPM兼容的Linux系統上的包管理器
Civilization IV - 游戲《文明4》
Battlefield 2 - 游戲《戰地2》
Google - 谷歌在很多項目中用python作為網路應用的後端,如Google Groups、Gmail、Google Maps等,Google App Engine支持python作為開發語言
NASA - 美國宇航局,從1994年起把python作為主要開發語言
Instrial Light & Magic - 工業光魔,喬治·盧卡斯創立的電影特效公司
Yahoo! Groups - 雅虎推出的群組交流平台
YouTube - 視頻分享網站,在某些功能上使用到python
Cinema 4D - 一套整合3D模型、動畫與繪圖的高級三維繪圖軟體,以其高速的運算和強大的渲染插件著稱
Autodesk Maya - 3D建模軟體,支持python作為腳本語言
gedit - Linux平台的文本編輯器
GIMP - Linux平台的圖像處理軟體
Minecraft: Pi Edition - 游戲《Minecraft》的樹莓派版本
MySQL Workbench - 可視化資料庫管理工具
Digg - 社交新聞分享網站
Mozilla - 為支持和領導開源的Mozilla項目而設立的一個非營利組織
Quora - 社交問答網站
Path - 私密社交應用
Pinterest - 圖片社交分享網站
SlideShare - 幻燈片存儲、展示、分享的網站
Yelp - 美國商戶點評網站
Slide - 社交遊戲/應用開發公司,被谷歌收購
Ⅶ python 案例問題
這個有2個知識點
1、python 的bool類型,也就是True和False,實質上市int型,也就是1和0,即True==1,False = 0
2、 [
[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
[31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
][is_leap_year(year)]
也就是函數返回True,返回list[1],反之list[0]
Ⅷ Python數據分析案例-葯店銷售數據分析
最近學習了Python數據分析的一些基礎知識,就找了一個葯品數據分析的小項目來練一下手。
數據分析的目的:
本篇文章中,假設以朝陽醫院2018年銷售數據為例,目的是了解朝陽醫院在2018年裡的銷售情況,通過對朝陽區醫院的葯品銷售數據的分析,了解朝陽醫院的患者的月均消費次數,月均消費金額、客單價以及消費趨勢、需求量前幾位的葯品等。
數據分析基本過程包括:獲取數據、數據清洗、構建模型、數據可視化以及消費趨勢分析。
數據准備
數據是存在Excel中的,可以使用pandas的Excel文件讀取函數將數據讀取到內存中,這里需要注意的是文件名和Excel中的sheet頁的名字。讀取完數據後可以對數據進行預覽和查看一些基本信息。
獲取數據:朝陽醫院2018年銷售數據.xlsx(非真實數據) 提取碼: 6xm2
導入原始數據
數據准備
數據是存在Excel中的,可以使用pandas的Excel文件讀取函數將數據讀取到內存中,這里需要注意的是文件名和Excel中的sheet頁的名字。讀取完數據後可以對數據進行預覽和查看一些基本信息。
獲取數據:朝陽醫院2018年銷售數據.xlsx(非真實數據) 提取碼: 6xm2
導入原始數據
數據清洗
數據清洗過程包括:選擇子集、列名重命名、缺失數據處理、數據類型轉換、數據排序及異常值處理
(1)選擇子集
在我們獲取到的數據中,可能數據量非常龐大,並不是每一列都有價值都需要分析,這時候就需要從整個數據中選取合適的子集進行分析,這樣能從數據中獲取最大價值。在本次案例中不需要選取子集,暫時可以忽略這一步。
(2)列重命名
在數據分析過程中,有些列名和數據容易混淆或產生歧義,不利於數據分析,這時候需要把列名換成容易理解的名稱,可以採用rename函數實現:
(3)缺失值處理
獲取的數據中很有可能存在缺失值,通過查看基本信息可以推測「購葯時間」和「社保卡號」這兩列存在缺失值,如果不處理這些缺失值會干擾後面的數據分析結果。
缺失數據常用的處理方式為刪除含有缺失數據的記錄或者利用演算法去補全缺失數據。
在本次案例中為求方便,直接使用dropna函數刪除缺失數據,具體如下:
(4)數據類型轉換
在導入數據時為了防止導入不進來,會強制所有數據都是object類型,但實際數據分析過程中「銷售數量」,「應收金額」,「實收金額」,這些列需要浮點型(float)數據,「銷售時間」需要改成時間格式,因此需要對數據類型進行轉換。
可以使用astype()函數轉為浮點型數據:
在「銷售時間」這一列數據中存在星期這樣的數據,但在數據分析過程中不需要用到,因此要把銷售時間列中日期和星期使用split函數進行分割,分割後的時間,返回的是Series數據類型:
此時時間是沒有按順序排列的,所以還是需要排序一下,排序之後索引會被打亂,所以也需要重置一下索引。
其中by:表示按哪一列進行排序,ascending=True表示升序排列,ascending=False表示降序排列
先查看數據的描述統計信息
通過描述統計信息可以看到,「銷售數量」、「應收金額」、「實收金額」這三列數據的最小值出現了負數,這明顯不符合常理,數據中存在異常值的干擾,因此要對數據進一步處理,以排除異常值的影響:
數據清洗完成後,需要利用數據構建模型(就是計算相應的業務指標),並用可視化的方式呈現結果。
月均消費次數 = 總消費次數 / 月份數(同一天內,同一個人所有消費算作一次消費)
月均消費金額 = 總消費金額 / 月份數
客單價 = 總消費金額 / 總消費次數
從結果可以看出,每天消費總額差異較大,除了個別天出現比較大筆的消費,大部分人消費情況維持在1000-2000元以內。
接下來,我銷售時間先聚合再按月分組進行分析:
結果顯示,7月消費金額最少,這是因為7月份的數據不完整,所以不具參考價值。
1月、4月、5月和6月的月消費金額差異不大.
2月和3月的消費金額迅速降低,這可能是2月和3月處於春節期間,大部分人都回家過年的原因。
d. 分析葯品銷售情況
對「商品名稱」和「銷售數量」這兩列數據進行聚合為Series形式,方便後面統計,並按降序排序:
截取銷售數量最多的前十種葯品,並用條形圖展示結果:
結論:對於銷售量排在前幾位的葯品,醫院應該時刻關注,保證葯品不會短缺而影響患者。得到銷售數量最多的前十種葯品的信息,這些信息也會有助於加強醫院對葯房的管理。
每天的消費金額分布情況:一橫軸為時間,縱軸為實收金額畫散點圖。
結論: 從散點圖可以看出,每天消費金額在500以下的占絕大多數,個別天存在消費金額很大的情況。
</article>
Ⅸ 求一個PYTHON案例
# 以下程序可能要安裝OpenCV2.0(並編譯好並配置好環境)以及Xvid解碼器才能運行
# _*_coding: cp936_*_
import cv
capture = cv.CreateFileCapture("tmp.avi")
#請確保當前目錄下有tmp.avi文件
fps = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FPS)
totalFrameNumber =cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_COUNT)
frameWidth = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_WIDTH)
frameHeight = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_HEIGHT)
print fps, totalFrameNumber, frameWidth, frameHeight
frame = cv.QueryFrame(capture)
while frame:
cv.ShowImage('Title', frame)
frame = cv.QueryFrame(capture)
if cv.WaitKey(1000 / fps) == 27:# ESC鍵退出視頻播放
cv.DestroyWindow('Title')
break
一個文件夾整理工具wxPython版本(不清楚軟體用法情況下可以打開該軟體看看界面但請不要使用裡面的功能,後果自負。)
# -*- coding: cp936 -*-
# file:aa.py
import os, shutil, sys
import wx
sourceDir = ''
sourceFiles = ''
preWord = 0
def browse(event):
global sourceDir, textPreWord, textDirName
dialog = wx.DirDialog(None, u'選擇待處理文件夾', style = wx.OPEN)
if dialog.ShowModal() == wx.ID_OK:
sourceDir = dialog.GetPath().strip('\"')
textDirName.SetLabel(sourceDir)
dialog.Destroy()
textPreWord.SetFocus()
def okRun(event):
global preWord, sourceDir, sourceFiles, textPreWord
preWord = int(textPreWord.GetValue())
if preWord <= 0:
wx.MessageBox(u'請正確輸入前綴字元個數!', u'出錯啦', style = wx.ICON_ERROR | wx.OK)
textPreWord.SetFocus()
return
sourceDir = textDirName.GetValue()
sourceFiles = os.listdir(sourceDir)
for currentFile in sourceFiles:
tmp = currentFile
currentFile = sourceDir + '\\' + currentFile
currentFile = currentFile.strip('\"')
if os.path.isdir(currentFile):
continue
targetDir = '%s\\%s'%(sourceDir, tmp[:preWord])
if not os.path.exists(targetDir):
os.mkdir(targetDir)
shutil.move(currentFile, targetDir)
wx.MessageBox(u'任務完成!', u'好消息', style = wx.ICON_ERROR | wx.OK)
def onChange(event):
global dir1, textDirName
p = dir1.GetPath()
textDirName.SetLabel(p)
app = wx.App(0)
win = wx.Frame(None, title = u'文件整理', size = (400, 450))
bg = wx.Panel(win)
btnBrowse = wx.Button(bg, label = u'瀏覽')
btnBrowse.Bind(wx.EVT_BUTTON, browse)
btnRun = wx.Button(bg, label = u'整理')
btnRun.Bind(wx.EVT_BUTTON, okRun)
dir1 = wx.GenericDirCtrl(bg, -1, dir='', style=wx.DIRCTRL_DIR_ONLY)
tree = dir1.GetTreeCtrl()
dir1.Bind(wx.wx.EVT_TREE_SEL_CHANGED, onChange, id = tree.GetId())
textPreWord = wx.TextCtrl(bg)
textDirName = wx.TextCtrl(bg)
textPreWord.SetFocus()
class MyFileDropTarget(wx.FileDropTarget):#聲明釋放到的目標
def __init__(self, window):
wx.FileDropTarget.__init__(self)
self.window = window
def OnDropFiles(self, x, y, filenames):#釋放文件處理函數數據
for name in filenames:
if not os.path.isdir(name):
wx.MessageBox(u'只能選擇文件夾!', '出錯啦', style = wx.ICON_ERROR | wx.OK)
return
self.window.SetValue(name)
dt = MyFileDropTarget(textDirName)
textDirName.SetDropTarget(dt)
hbox0 = wx.BoxSizer()
hbox0.Add(dir1, proportion = 1, flag = wx.EXPAND | wx.ALL, border = 5)
hbox1 = wx.BoxSizer()
hbox1.Add(textDirName, proportion = 1, flag = wx.EXPAND, border = 5)
hbox1.Add(btnBrowse, proportion = 0, flag = wx.LEFT, border = 5)
hbox2 = wx.BoxSizer()
hbox2.Add(textPreWord, proportion = 1, flag = wx.EXPAND, border = 5)
hbox2.Add(btnRun, proportion = 0, flag = wx.LEFT, border = 5)
vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(hbox0, proportion = 1, flag = wx.EXPAND | wx.ALL, border = 5)
vbox.Add(wx.StaticText(bg, -1, u'\n 選擇待處理文件夾路徑:'))
vbox.Add(hbox1, proportion = 0, flag = wx.EXPAND | wx.ALL, border = 5)
vbox.Add(wx.StaticText(bg, -1, u'\n\n 前綴字元個數:'))
vbox.Add(hbox2, proportion = 0, flag = wx.EXPAND | wx.ALL, border = 5)
vbox.Add(wx.StaticText(bg, -1, u'\n'))
bg.SetSizer(vbox)
win.Center()
win.Show()
app.MainLoop()
#py2exe打包代碼如下:
from distutils.core import setup
import py2exe
setup(windows=["aa.py"])
打包好了之後有18Mb。
一個文件內容批量替換摸查器(wxPython版本):
# _*_ coding:cp936 _*_
from string import join, split
import os
import wx
def getAllFiles(adir):
tmp = []
for parent, dirs, files in os.walk(adir):
for afile in files:
tmp.append(os.path.join(parent, afile))
return tmp
def browse(event):
dialog = wx.DirDialog(None, '選擇待處理文件夾', style=wx.OPEN)
if dialog.ShowModal() == wx.ID_OK:
aDir = dialog.GetPath()
textDir.SetLabel(aDir)
dialog.Destroy()
def check():
promp.SetForegroundColour('#FF0000')
promp.SetLabel(' 搜索中...')
listFound.ClearAll()
tmp = []
files = getAllFiles(textDir.GetValue())
for filename in files:
try:
afile = open(filename, 'r')
except IOError:
print '打開文件錯誤。'
continue
try:
content = afile.read().decode('utf-8')
afile.close()
except:
try:
afile = open(filename, 'r')
content = afile.read().decode('cp936')
afile.close()
except:
continue
if textNeedChar.GetValue() in content:
tmp.append(filename)
listFound.InsertStringItem(0, filename)
parentDir.SetForegroundColour('#FF0000')
# parentDir.SetLabel(' 正在搜索:'+filename)
return tmp
def onFind(event):
check()
parentDir.SetLabel(' 搜索結果:')
promp.SetLabel(' 任務完成。')
wx.MessageBox(listFound.GetItemCount() and '任務完成,找到%d個文件。' % listFound.GetItemCount()
or '未找到包含"%s"的文件!' % textNeedChar.GetValue().encode('cp936'), '查找結束',
style=wx.ICON_INFORMATION | wx.OK)
def onReplace(event):
dg = wx.TextEntryDialog(bg, '替換成:', '提示', style=wx.OK | wx.CANCEL)
if dg.ShowModal() != wx.ID_OK:
return
files = check()
userWord = dg.GetValue()
#if not userWord:
#wx.MessageBox('請輸入要替換為何字!', style=wx.ICON_ERROR | wx.OK)
#onReplace(event)
#return
for filename in files:
try:
afile = open(filename, 'r')
except IOError:
print '打開文件錯誤。'
continue
try:
content = afile.read().decode('utf-8')
afile.close()
except:
try:
afile = open(filename, 'r')
content = afile.read().decode('cp936')
afile.close()
except IOError:
print '打開文件錯誤。'
continue
content = content.replace(textNeedChar.GetValue(), userWord)
try:
content = content.encode('utf-8')
except:
pass
open(filename, 'w').write(content)
parentDir.SetLabel(' 替換的文件:')
promp.SetLabel(' 任務完成。')
wx.MessageBox(listFound.GetItemCount() and '任務完成,替換了%d個文件。' % listFound.GetItemCount()
or '未找到包含"%s"的文件!' % textNeedChar.GetValue().encode('cp936'), '替換結束', style=wx.ICON_INFORMATION | wx.OK)
app = wx.App(0)
win = wx.Frame(None, title='文件整理', size=(400, 450))
bg = wx.Panel(win)
btnBrowse = wx.Button(bg, label='瀏覽')
btnBrowse.Bind(wx.EVT_BUTTON, browse)
btnFind = wx.Button(bg, label='查找')
btnFind.Bind(wx.EVT_BUTTON, onFind)
btnFind.SetDefault()
btnReplace = wx.Button(bg, label='替換')
btnReplace.Bind(wx.EVT_BUTTON, onReplace)
textNeedChar = wx.TextCtrl(bg, value='你好')
textDir = wx.TextCtrl(bg, value='E:\Workspace\Python\Python\e')
parentDir = wx.StaticText(bg)
promp = wx.StaticText(bg)
listFound = wx.ListCtrl(bg, style=wx.VERTICAL)
class MyFileDropTarget(wx.FileDropTarget):#聲明釋放到的目標
def __init__(self, window):
wx.FileDropTarget.__init__(self)
self.window = window
def OnDropFiles(self, x, y, filenames):#釋放文件處理函數數據
for name in filenames:
'''if not os.path.isdir(name):
wx.MessageBox('只能選擇文件夾!', '出錯啦', style=wx.ICON_ERROR | wx.OK)
return '''
self.window.SetValue(name)
dt = MyFileDropTarget(textDir)
textDir.SetDropTarget(dt)
hbox1 = wx.BoxSizer()
hbox1.Add(textDir, proportion=1, flag=wx.EXPAND, border=5)
hbox1.Add(btnBrowse, proportion=0, flag=wx.LEFT, border=5)
hbox2 = wx.BoxSizer()
hbox2.Add(textNeedChar, proportion=1, flag=wx.EXPAND, border=5)
hbox2.Add(btnFind, proportion=0, flag=wx.LEFT, border=5)
hbox2.Add(btnReplace, proportion=0, flag=wx.LEFT, border=5)
vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(wx.StaticText(bg, -1, '\n 選擇待處理文件夾(可拖動文件夾到下面區域中):'))
vbox.Add(hbox1, proportion=0, flag=wx.EXPAND | wx.ALL, border=5)
vbox.Add(wx.StaticText(bg, -1, '\n\n 要替換 / 查找的文字:'))
vbox.Add(hbox2, proportion=0, flag=wx.EXPAND | wx.ALL, border=5)
vbox.Add(promp, proportion=0, flag=wx.EXPAND | wx.ALL, border=5)
vbox.Add(parentDir, proportion=0, flag=wx.EXPAND | wx.ALL, border=5)
vbox.Add(listFound, proportion=1,
flag=wx.EXPAND | wx.LEFT | wx.BOTTOM | wx.RIGHT, border=5)
bg.SetSizer(vbox)
win.Center()
win.Show()
app.MainLoop()