天天看點

50. Python 資料處理(1)

今天開始往後都,用python3來寫腳本

1.csv資料處理

csv檔案格式:

逗号分隔符(csv),有時也稱為字元分隔值,因為分隔字元也可以不是逗号,其檔案以純文字的形式存儲表格資料(數字和文本)。

純文字意味着該檔案是一個字元序列,不含必須像二進制數字那樣被解讀的資料。

csv檔案由任意數目的記錄組成,記錄間以某種換行符分割;每條記錄由字段組成,字段間的分隔符是其他字元或字元串,最常見的是逗号或制表符。通常,所有記錄都有完全相同的字段序列。

csv資料,如以下格式:

27,20,14,15,14,12,94,64,37,1015,1013,1009,7,5,2,21,8,35,0.00,152

另外,csv檔案可以直接用excel或者類似軟體打開,樣子都是我們常見的表格形式。

平常我們取檔案内的資料存入清單一般用以下方法:

<code>import</code> <code>codecs</code>

<code>lineText </code><code>=</code> <code>list</code><code>()</code>

<code>with codecs.</code><code>open</code><code>(</code><code>"sl_original_live.csv"</code><code>,encoding</code><code>=</code><code>"utf-8"</code><code>) as f:</code>

<code>    </code><code>for</code> <code>line </code><code>in</code> <code>f.readlines():</code>

<code>        </code><code>print</code> <code>(line.split(</code><code>","</code><code>))            </code><code>#以清單形式,列印每一行的資料。</code>

<code>        </code><code>lineText.append(line.split(</code><code>","</code><code>))</code>

<code>    </code><code>print</code> <code>(lineText)               </code><code>#把上面所有行作為元素資料,存入一個清單中。</code>

csv子產品用法,使用子產品來處理資料:

<code>import</code> <code>csv</code>

<code>fileName </code><code>=</code> <code>"sl_original_live.csv"</code>

<code>with codecs.</code><code>open</code><code>(fileName) as fcsv:</code>

<code>    </code><code>linecsv </code><code>=</code> <code>csv.reader(fcsv)</code>

<code>    </code><code>rows </code><code>=</code> <code>[row </code><code>for</code> <code>row </code><code>in</code> <code>linecsv]</code>

<code>    </code><code>print</code> <code>(rows)</code>

以上了解即可。

2.excel資料處理

python 提供有第三方庫來支援excel的操作,python處理excel檔案用的第三方子產品庫,有xlrd、xlwt、xluntils和pyExcelerator,

除此之外,python處理excel還可以用win32com和openpyxl子產品.

我們主要用xlrd、xlwt、xluntils這三個子產品,pyExcelerator子產品偶爾也會用:

<code>pip install xlrd</code>

<code>pip install xlwt</code>

<code>pip install xlutils</code>

<code>pip install pyExcelerator</code>

xlrd 隻能進行讀取excel檔案,沒法進行寫入檔案;

xlwt 可以寫入檔案,但是不能在已有的excel的檔案上進行修改;

xluntils 可以在已有的excel檔案上進行修改;

pyExcelerator 與xlwt類似,也可以用來生成excel檔案

讀取表單資料:

舉例:按行取資料

<code>import</code> <code>xlrd</code>

<code>def</code> <code>readExcel():</code>

<code>    </code><code>data </code><code>=</code> <code>xlrd.open_workbook(</code><code>'test.xlsx'</code><code>)</code>

<code>    </code><code>table </code><code>=</code> <code>data.sheets()[</code><code>0</code><code>]         </code><code># 打開第一張表</code>

<code>    </code><code>nrows </code><code>=</code> <code>table.nrows          </code><code># 擷取表的行數</code>

<code>    </code><code>for</code> <code>i </code><code>in</code> <code>range</code><code>(nrows):          </code><code># 循環逐行列印</code>

<code>        </code><code>print</code><code>(table.row_values(i))      </code><code>#通過row_values來擷取每行的值</code>

<code>        </code> 

<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>'__main__'</code><code>:</code>

<code>    </code><code>readExcel()</code>

舉例:按豎列取資料

<code>data </code><code>=</code> <code>xlrd.open_workbook(</code><code>"whsc.xlsx"</code><code>)</code>

<code>table2 </code><code>=</code> <code>data.sheet_by_name(</code><code>"域名"</code><code>)       </code><code>#sheet标簽頁的名稱</code>

<code>for</code> <code>col </code><code>in</code> <code>range</code><code>(table2.ncols):</code>

<code>    </code><code>print</code> <code>(table2.col_values(col))</code>

舉例:建立新的并寫入excel檔案(xlwt無法修改原有檔案)

<code>import</code> <code>xlwt</code>

<code>excel </code><code>=</code> <code>xlwt.Workbook()</code>

<code>#建立3個表</code>

<code>sheet1 </code><code>=</code> <code>excel.add_sheet(</code><code>"sheet1"</code><code>)</code>

<code>sheet2 </code><code>=</code> <code>excel.add_sheet(</code><code>"sheet2"</code><code>)</code>

<code>sheet3 </code><code>=</code> <code>excel.add_sheet(</code><code>"sheet3"</code><code>)</code>

<code>#隻在第一個表sheet1裡寫資料,如下:</code>

<code>sheet1.write(</code><code>0</code><code>,</code><code>0</code><code>,</code><code>"hello world1"</code><code>, cell_overwrite_ok</code><code>=</code><code>True</code><code>)</code>

<code>sheet1.write(</code><code>1</code><code>,</code><code>0</code><code>,</code><code>"hello world2"</code><code>, cell_overwrite_ok</code><code>=</code><code>True</code><code>)</code>

<code>sheet1.write(</code><code>2</code><code>,</code><code>0</code><code>,</code><code>"hello world3"</code><code>, cell_overwrite_ok</code><code>=</code><code>True</code><code>)</code>

<code>#第一個是行,第二個是列,第三個是内容,第二個參數用來确認同一個cell單元是否可以重設值。</code>

<code>excel.save(</code><code>"hello.xlsx"</code><code>)</code>

<code>print</code><code>(</code><code>"建立hello.xlsx完成"</code><code>)</code>

效果如下:

舉例:字型效果

使用樣式,字型類型、加粗等效果:

<code>#初始化樣式</code>

<code>style </code><code>=</code> <code>xlwt.XFStyle()</code>

<code>#為樣式建立字型</code>

<code>font </code><code>=</code> <code>xlwt.Font()</code>

<code>font.name </code><code>=</code> <code>'Times New Roman'</code>   <code>#指定字型名稱</code>

<code>font.bold </code><code>=</code> <code>True</code>              <code>#是否加粗</code>

<code>#設定樣式的字型</code>

<code>style.font </code><code>=</code> <code>font</code>

<code>#使用樣式</code>

<code>sheet3.write(</code><code>0</code><code>,</code><code>1</code><code>,</code><code>'some bold Times text'</code><code>,style)</code>

<code>#儲存該excel檔案,有同名檔案時直接覆寫</code>

<code>excel.save(</code><code>'hello.xlsx'</code><code>)</code>

<code>print</code><code>(</code><code>'建立hello.xlsx檔案完成!'</code><code>)</code>

舉例:處理超連結

<code>book </code><code>=</code> <code>xlwt.Workbook()</code>

<code>sheet_index </code><code>=</code> <code>book.add_sheet(</code><code>'index'</code><code>)</code>

<code>line</code><code>=</code><code>0</code>

<code>for</code> <code>i </code><code>in</code> <code>range</code><code>(</code><code>9</code><code>):</code>

<code>    </code><code>link </code><code>=</code> <code>'HYPERLINK("{0}.txt", "{1}_11111")'</code><code>.</code><code>format</code><code>(i, i)</code>

<code>    </code><code>#{0}.txt是要連結的檔案,{1}_11111是連結檔案的内容</code>

<code>    </code><code>sheet_index.write(i, </code><code>0</code><code>, xlwt.Formula(link))</code>

<code>    </code><code>#第一個行号,第二個列号,第三個是寫入内容link,内容裡面超連結</code>

<code>book.save(</code><code>'simple2.xlsx'</code><code>)</code>

<code>for</code> <code>i </code><code>in</code> <code>range</code><code>(</code><code>0</code><code>, </code><code>9</code><code>):</code>

<code>    </code><code>file</code> <code>=</code> <code>str</code><code>(i) </code><code>+</code> <code>".txt"</code>

<code>    </code><code>with codecs.</code><code>open</code><code>(</code><code>file</code><code>, </code><code>'w'</code><code>) as f:</code>

<code>        </code><code>f.write(</code><code>str</code><code>(i)</code><code>*</code><code>10</code><code>)</code>

3.HTML檔案轉化成PDF檔案

轉換成pdf的三種方法:

在工作中,會遇到把html檔案轉換成pdf檔案

python給我們提供了pdfkit這個子產品,直接安裝使用就可以了

下面就下來介紹一個pdfkit子產品的幾種用法

首先,我們安裝該子產品:

<code>pip </code><code>install</code> <code>pdfkit</code>

1.網頁轉換成pdf(直接把url轉換成pdf檔案)

<code>import</code> <code>pdfkit</code>

<code>pdfkit.from_url(</code><code>'http://google.com'</code><code>, </code><code>'out1.pdf'</code><code>)</code>

2. Html轉換成pdf

<code>pdfkit.from_file(</code><code>'test.html'</code><code>, </code><code>'out2.pdf'</code><code>)</code>

3. 字元串轉換成pdf

<code>pdfkit.from_string(</code><code>'Hello lingxiangxiang!'</code><code>, </code><code>'out3.pdf'</code><code>)</code>

三種方法簡單例子:

<code>pdfkit.from_file(</code><code>"hello.html"</code><code>, </code><code>1.pdf</code><code>)</code>

<code>pdfkit.from_url(</code><code>"www.baidu.com"</code><code>, </code><code>2.pdf</code><code>)</code>

<code>pdfkit.from_string(</code><code>"hello world"</code><code>, </code><code>3.pdf</code><code>)</code>

即可生成pdf檔案~

舉例:

抓取aming的linux教程,然後制作成pdf檔案

先抓取每個的網頁,然後生成pdf檔案

(1)檢視網頁源代碼

(2)檢視源代碼内容

和url對應規律

http://www.apelearn.com/study_v2/chapter2.html

http://www.apelearn.com/study_v2/chapter5.html

http://www.apelearn.com/study_v2/chapter7.html

... ...

代碼如下(未封裝,回頭有空封裝一下):

<code>import</code> <code>os</code>

<code>import</code> <code>re</code>

<code>import</code> <code>requests</code>

<code>if</code> <code>not</code> <code>os.path.exists(</code><code>"aminglinux"</code><code>):</code>

<code>    </code><code>os.mkdir(</code><code>"aminglinux"</code><code>)</code>

<code>os.chdir(</code><code>"aminglinux"</code><code>)</code>

<code>url </code><code>=</code> <code>"http://www.apelearn.com/study_v2/"</code>

<code>s </code><code>=</code> <code>requests.session()</code>

<code>text </code><code>=</code> <code>s.get(url).text</code>

<code>reg </code><code>=</code> <code>re.</code><code>compile</code><code>(r</code><code>'&lt;li class=\"toctree-l1\"&gt;&lt;a class=\"reference internal\" href=\"(.*)\"&gt;.*&lt;\/a&gt;&lt;\/li&gt;'</code><code>)</code>

<code>result </code><code>=</code> <code>reg.findall(text)</code>

<code>res </code><code>=</code> <code>list</code><code>(</code><code>set</code><code>(result))</code>

<code>for</code> <code>i </code><code>in</code> <code>res:</code>

<code>    </code><code>purl </code><code>=</code> <code>"{0}{1}"</code><code>.</code><code>format</code><code>(url, i)</code>

<code>    </code><code>print</code> <code>(purl)</code>

<code>    </code><code>pdfFileName </code><code>=</code> <code>i.replace(</code><code>"html"</code><code>, </code><code>"pdf"</code><code>)</code>

<code>    </code><code>print</code> <code>(pdfFileName)</code>

<code>    </code><code>config </code><code>=</code> <code>pdfkit.configuration(wkhtmltopdf</code><code>=</code><code>r</code><code>"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe"</code><code>)</code>

<code>    </code><code>try</code><code>:</code>

<code>        </code><code>pdfkit.from_url(purl, pdfFileName, configuration</code><code>=</code><code>config)</code>

<code>    </code><code>except</code><code>:</code>

<code>        </code><code>continue</code>

執行結果:

本文轉自 聽丶飛鳥說 51CTO部落格,原文連結:http://blog.51cto.com/286577399/2062339