最近在學校的發展規划處參加了一小部分代碼的編寫工作,主要功能邏輯是把從ESI上下載下來的各領域表中的數據進行分析。說是讓我接手前人所做的工作,卻發現給我的資料當中只有兩個exe文件,沒有任何源碼,只好從頭寫起。雖說不涉及爬蟲,也不是很難,但是要處理這么多數據,要生成這么多表確實還挺煩的,加之我毫無Python編程基礎,在項目編寫過程中難免遇到問題,下面是我在程序編寫的過程中遇到的問題,有些是對Python語言特性不熟悉而產生的問題,有些是自己對代碼邏輯沒搞懂而遇到的問題。
1. 用Python操作Excel
讀
import xlrd cwd = os.getcwd() FilePath = cwd + "\\file.xls" File = xlrd.open_workbook(FilePath) sheet = File.sheet_by_index(0) #獲得某個cell的值 sheet.cell_value(x, y)
寫
import xlwt FilePath = cwd + "\\file.xls" File = xlwt.Workbook(encoding = 'utf-8', style_compression = 0) sheet = File.add_sheet('sheet0', cell_overwrite_ok = True) #寫單元格 sheet.write(x, y, content, style) #單元格合並 sheet.write_merge(x1, x2, y1, y2, content, style) #即合並x1到x2列、y1到y2行(含x2與y2)的單元格,網上解釋的十分復雜,但是邏輯非常簡單的 File.save(FilePath) #注意最后一定要保存!
單元格樣式
#若直接以style()作為write的參數,每次運行一行write都會創建一個新的style對象,程序會報錯,比較保險的方法是在使用之前先創建一個style對象,用的使用直接使用style對象作為參數傳入即可。 StyleDefault = style() sheet1.write(0,0, content1, StyleDefault) sheet1.write(1,1, content2, StyleDefault) sheet1.write(2,2, content3, StyleDefault) #設置單元格寬、高 sheet.col(1).width = 4000 sheet.row(1).height = 3000
2. Python特性
(1)自加/自減
編寫代碼過程中發現Python並沒有其他語言中很常見的++、--運算符,於是查了資料,才知道python是以內容為基准的,而不像C/C++以變量為基准,同一個數字5可以用多個名稱來訪問,a=5和b=5指向的都是同一個對象(可以使用id()觀察發現)。這樣的邏輯就決定了數字類型的值是無法改變的,也就無法使用自增自減運算符。
正確的自增:a = a + 1 / a += 1
其中,python有個整數池,默認1~256的數字都屬於這個整數池,這些每次賦值的時候,是取得池中的整數對象。
(2)is 與 ==
若is是True的,那么==的結果也為True
is compares for two objects in
memory, == compares their
values
(3)數組的初始化
Python中不能直接使用一個沒有初始化的數組,一維數組的初始化比較簡單,直接用0代表初始元素即可,如a = [0] * 10。二維數組的初始化主要有這幾種方式:
[([0] * 3) for i in range(4)] [[0 for col in range(3)] for row in range(4)]
創建一個4行3列的二維數組
(4)關於List
Python中的List與Array不同,同一個List里的元素數據類型可以不同,其實它保存的就是指針的集合,而非數據本身。Array是numpy當中封裝的,轉換關系如下:
a=np.array([1,2,3,4,5]) #List轉換為Array b=np.array([[1,2,3],[4,5,6]]) #List轉換為二維Array c=list(a) #Array轉換為List
List的排序方法是sort(),如果要降序排序,則需要添加一個(reverse=True)參數,如:list1.sort(reverse=True)
當List作為參數傳入一個函數時,是作為實參傳入的,如果在函數內操作該List時,原來的List也會發生變化,要生成這個List的副本,使用copy()方法即可,如list2 = list1.copy()
(5)循環操作
比較常用的是for循環,與其他語言的循環語句不同,Python的循環語句是“for i in range(10)”或“for i in range(0, 10)”的形式,要注意的是后一個參數是不包括在判斷當中的,相當於“for(i = 0, i < 10; i++)”。若要遍歷一個List當中的元素同時獲得該元素對應的index,則需要使用“for i, item in enumerate(List1)”的格式。
(6)小數輸出為百分號格式
decimal = "%.2f%%" % (num * 100)
主要先是這些問題,日后想到再補充……