CSV(Comma-Separated Values)即逗號分隔值,能夠用Excel打開查看。因爲是純文本,任何編輯器也均可打開。與 Excel 文件不一樣,CSV 文件中:html
在CSV文件中,以 "," 做爲分隔符,分隔兩個單元格。像這樣a,,c
表示單元格a
和單元格c
之間有個空白的單元格。依此類推。python
不是每一個逗號都表示單元格之間的分界。因此即便CSV是純文本文件,也堅持使用專門的模塊進行處理。Python內置了csv模塊。先看看一個簡單的例子。linux
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2018/6/7 20:43 # @Author : zhouyuyao # @File : demon1.py import csv filename = "E:/GitHub/Python-Learning/LIVE_PYTHON/2018-06-05/學位英語成績合格彙總表.csv" with open(filename) as f: reader = csv.reader(f) print(list(reader))
reader 不能直接打印,list(reader) 最外層是 list,裏層的每一行數據都在一個list中,有點像這樣正則表達式
[['姓名', '性別', '民族', '專業名稱', '成績'], ['劉競超', '男', '漢族', '工商企業管理', '60'], ··· ···]
若是咱們想要知道 「劉競超」 的成績 reader[1][5],在 for 循環中遍歷以下windows
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2018/6/7 20:43 # @Author : zhouyuyao # @File : demon1.py import csv filename = "E:/GitHub/Python-Learning/LIVE_PYTHON/2018-06-05/學位英語成績合格彙總表.csv" with open(filename) as f: reader = csv.reader(f) for i in reader: # 行號從1開始 print(reader.line_num,i)
輸出的結果以下所示centos
1 ['姓名', '性別', '民族', '專業名稱', '成績'] 2 ['劉競超', '男', '漢族', '工商企業管理', '60'] 3 ['劉毅', '女', '漢族', '金融管理', '70'] 4 ['李自根', '男', '漢族', '園林', '75'] 5 ··· ···
前面的數字是行號,從1開始,能夠用 reader.line_num
獲取。安全
要注意的是,reader 只能被遍歷一次。因爲 reader 是可迭代對象,可使用 next
方法一次獲取一行。bash
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2018/6/7 20:43 # @Author : zhouyuyao # @File : demon1.py import csv filename = "E:/GitHub/Python-Learning/LIVE_PYTHON/2018-06-05/學位英語成績合格彙總表.csv" with open(filename) as f: reader = csv.reader(f) # 讀取一行,下面的reader中已經沒有該行了 head_row=next(reader) for i in reader: # 行號從2開始 print(reader.line_num,i)
在這裏值得一提的是,在PyCharm中複製路徑的時候一直出現找不到文件,這是因爲在python程序裏面咱們常常須要對文件進行操做,Windows 下的文件目錄路徑使用反斜槓 「\」 來分隔。可是,和大多數語言同樣,Python 代碼裏面,反斜槓 「\」 是轉義符,例如 「\n」 表示回車、「\t」 表示製表符等等。這樣,若是繼續用windows 習慣使用 「\」 表示文件路徑,就會產生歧義。session
例如:「c:\test.txt」 這表示 c 盤根目錄下的一個文件,仍是表示一個字符串呢?由於 「\t」 也能夠解釋爲製表符。若是讓咱們人來判斷,這固然是一個很簡單的問題。可是機器就沒法作出正確的判斷了,只有沒有歧義的代碼機器纔會正確執行。編輯器
解決辦法,採用下面任何一種書寫形式都可:
"c:/test.txt"
… 不用反斜槓就無法產生歧義了
"
c:\\test.txt
"… 由於反斜槓是轉義符,因此兩個"\\"就表示一個反斜槓符號
r"c:\test.txt" … python下在字符串前面加上字母r,表示後面是一個原始字符串
raw string,不過raw string主要是爲正則表達式而不是windows路徑設計的,因此這種作法儘可能少用,可能會出問題。有reader能夠讀取,固然也有writer能夠寫入。一次寫入一行,一次寫入多行均可以。
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2018/6/8 10:12 # @Author : zhouyuyao # @File : demon2.py import csv # 使用數字和字符串的數字均可以 datas=[ ['朱麗蓉', '女', '漢族', '金融管理', '84'], ['吳江滔', '女', '漢族', '企業財務管理', '78'] ] filename = "E:/GitHub/Python-Learning/LIVE_PYTHON/2018-06-05/學位英語成績合格彙總表.csv" with open(filename,"a",newline="") as f: writer = csv.writer(f) for row in datas: writer.writerow(row) # 寫入多行 writer.writerows(datas)
以後咱們能夠在csv文件中看到剛剛寫入的數據
1 ['姓名', '性別', '民族', '專業名稱', '成績'] 2 ['張沐青', '女', '漢族', '金融管理', '62'] 3 ['金彥豪', '男', '朝鮮族', '環境工程', '67'] 4 ['朱麗蓉', '女', '漢族', '金融管理', '84'] 5 ['吳江滔', '女', '漢族', '企業財務管理', '78'] 6 ['朱麗蓉', '女', '漢族', '金融管理', '84'] 7 ['吳江滔', '女', '漢族', '企業財務管理', '78']
使用 DictReader 能夠像操做字典那樣獲取數據,把表的第一行(通常是標頭)做爲 key。可訪問每一行中那個某個 key 對應的數據。
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2018/6/8 10:12 # @Author : zhouyuyao # @File : demon2.py import csv # 使用數字和字符串的數字均可以 datas = [ {'姓名': '張沐青', '性別': '女', '民族': '漢族', '專業名稱': '金融管理', '成績': '62'} ] filename = "E:/GitHub/Python-Learning/LIVE_PYTHON/2018-06-05/學位英語成績合格彙總表.csv" with open(filename, "a") as f: headers = [k for k in datas[0]] # 取出待寫入數據中的 key 值 writer = csv.DictWriter(f, headers) ''' __init__(self, f, fieldnames, restval="", extrasaction="raise", dialect="excel", *args, **kwds): self.fieldnames = fieldnames # list of keys for the dict self.restval = restval # for writing short dicts if extrasaction.lower() not in ("raise", "ignore"): raise ValueError("extrasaction (%s) must be 'raise' or 'ignore'" % extrasaction) self.extrasaction = extrasaction self.writer = writer(f, dialect, *args, **kwds) ''' writer.writeheader() ''' def writeheader(self): header = dict(zip(self.fieldnames, self.fieldnames)) self.writerow(header) ''' for row in datas: writer.writerow(row) # 寫入多行 # writer.writerows(datas) with open(filename, 'r+') as csv_file: reader = csv.DictReader(csv_file) ''' def __init__(self, f, fieldnames=None, restkey=None, restval=None, dialect="excel", *args, **kwds): self._fieldnames = fieldnames # list of keys for the dict self.restkey = restkey # key to catch long rows self.restval = restval # default value for short rows self.reader = reader(f, dialect, *args, **kwds) self.dialect = dialect self.line_num = 0 ''' print(str([row for row in reader]))
運行以後在IDE的顯示結果以下
[OrderedDict([('姓名', '張沐青'), ('性別', '女'), ('民族', '漢族'), ('專業名稱', '金融管理'), ('成績', '62')]), OrderedDict([('姓名', '金彥豪'), ('性別', '男'), ('民族', '朝鮮族'), ('專業名稱', '環境工程'), ('成績', '67')]), OrderedDict([('姓名', '姓名'), ('性別', '性別'), ('民族', '民族'), ('專業名稱', '專業名稱'), ('成績', '成績')]), OrderedDict([('姓名', '張沐青'), ('性別', '女'), ('民族', '漢族'), ('專業名稱', '金融管理'), ('成績', '62')])]
用 Excel 打開 csv 文件顯示以下
python 提供有第三方庫來支持excel的操做,python處理excel文件用的第三方模塊庫,有xlrd、xlwt、xluntils和pyExcelerator,
除此以外,python處理excel還能夠用win32com和openpyxl模塊.
咱們主要用xlrd、xlwt、xluntils這三個模塊,pyExcelerator模塊偶爾也會用:
pip install xlrd pip install xlwt pip install xlutils pip install pyExcelerator
xlrd 只能進行讀取excel文件,無法進行寫入文件;
xlwt 能夠寫入文件,可是不能在已有的excel的文件上進行修改;
xluntils 能夠在已有的excel文件上進行修改;
pyExcelerator 與xlwt相似,也能夠用來生成excel文件
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2018/6/8 13:58 # @Author : zhouyuyao # @File : demon1.py import xlrd filename="E:/GitHub/Python-Learning/LIVE_PYTHON/2018-06-07/學位英語成績合格彙總表.xls" def readExcel(): data = xlrd.open_workbook(filename) table = data.sheets()[0] # 打開第一張表 nrows = table.nrows # 獲取表的行數 for i in range(nrows): # 循環逐行打印 print(table.row_values(i)) # 經過row_values來獲取每行的值 if __name__ == '__main__': readExcel()
讀取結果
['姓名', '性別', '民族', '專業名稱', '成績'] ['張沐青', '女', '漢族', '金融管理', 62.0] ['金彥豪', '男', '朝鮮族', '環境工程', 67.0] ['毛倩', '女', '漢族', '金融管理', 60.0] ['周冬', '男', '漢族', '企業財務管理', 64.0]
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2018/6/8 14:23 # @Author : zhouyuyao # @File : demon2.py filename="E:/GitHub/Python-Learning/LIVE_PYTHON/2018-06-07/學位英語成績合格彙總表.xls" import xlrd data = xlrd.open_workbook(filename) table2 = data.sheet_by_name("test2") # "test2" 爲 sheet 標籤頁的名稱 for col in range(table2.ncols): print (table2.col_values(col))
讀取結果以下
['姓名', '劉競超', '劉毅', '李自根', '李思琦'] ['性別', '男', '女', '男', '男'] ['民族', '漢族', '漢族', '漢族', '漢族'] ['專業名稱', '工商企業管理', '金融管理', '園林', '工商管理'] ['成績', 60.0, 70.0, 75.0, 78.0]
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2018/6/8 14:30 # @Author : zhouyuyao # @File : demon3.py import xlwt excel = xlwt.Workbook() # 建立3個表 sheet1 = excel.add_sheet("test1",cell_overwrite_ok=True) # cell_overwrite_ok 參數用來確認同一個cell單元是否能夠重設值 sheet2 = excel.add_sheet("test2") sheet3 = excel.add_sheet("test3") # 只在第一個表sheet1裏寫數據,以下: sheet1.write(0,0,"hello world1") sheet1.write(1,0,"hello world2") sheet1.write(2,0,"hello world3") # 第一個是行,第二個是列,第三個是內容。 excel.save("./hello.xlsx") print("建立hello.xlsx完成")
運行以後在代碼文件的同級目錄下將建立一個 hello.xlsx 文件,而且有三張表,第一張表中有三行內容,內容以下
注:每個 excel 文件就是一個工做簿。每一個工做簿中有一張或若干張工做表。
使用樣式,字體類型、加粗等效果:
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2018/6/8 14:51 # @Author : zhouyuyao # @File : demon4.py import xlwt excel = xlwt.Workbook() # 建立3個表 sheet1 = excel.add_sheet("sheet1") sheet2 = excel.add_sheet("sheet2") sheet3 = excel.add_sheet("sheet3") # 初始化樣式 style = xlwt.XFStyle() # 爲樣式建立字體 font = xlwt.Font() font.name = u'微軟雅黑' # 指定字體名稱 font.bold = True # 是否加粗 # 設置樣式的字體 style.font = font # 使用樣式 sheet3.write(0,1,u'微軟雅黑',style) # 保存該excel文件,有同名文件時直接覆蓋 excel.save('world.xlsx') print('建立world.xlsx文件完成!')
運行以後將在同級目錄下建立一個 world.xlsx 文件,在第三張表的第一行第二列新增內容,以下所示
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2018/6/8 14:58 # @Author : zhouyuyao # @File : demon5.py import codecs import xlwt book = xlwt.Workbook() sheet_index = book.add_sheet('index') line=0 for i in range(9): link = 'HYPERLINK("{0}.txt", "{1}_11111")'.format(i, i) # {0}.txt是要連接的文件,{1}_11111是連接文件的內容 sheet_index.write(i, 0, xlwt.Formula(link)) # 第一個行號,第二個列號,第三個是寫入內容link,內容裏面超連接 book.save('HowAreYou.xlsx') for i in range(0, 9): file = str(i) + ".txt" with codecs.open(file, 'w') as f: f.write(str(i)*10)
運行以後將在同級目錄下建立 8 個 txt 文件和一個 Excel 文件,打開 Excel 文件,點擊一行的內容都將連接到一個txt 文件並打開它
轉換成pdf的三種方法:
在工做中,會遇到把html文件轉換成pdf文件
python給咱們提供了pdfkit這個模塊,直接安裝使用就能夠了
這裏須要注意的是,爲了更好的處理,咱們須要在 Windows 上從 https://wkhtmltopdf.org/ 下載 wkhtmltopdf 應用,以便在代碼中進行調用 (Windows 上爲 exe 文件,Linux 上爲二進制文件)。
下面就來介紹一個pdfkit模塊的幾種用法
首先,咱們安裝該模塊:
pip install pdfkit
import pdfkit pdfkit.from_url('http://google.com', 'out1.pdf')
import pdfkit pdfkit.from_file('test.html', 'out2.pdf')
import pdfkit pdfkit.from_string('Hello lingxiangxiang!', 'out3.pdf')
三種方法簡單例子:
import pdfkit pdfkit.from_file("hello.html", 1.pdf) pdfkit.from_url("www.baidu.com", 2.pdf) pdfkit.from_string("hello world", 3.pdf)
便可生成pdf文件~
舉例:
抓取aming的linux教程,而後製做成pdf文件
先抓取每一個的網頁,而後生成pdf文件
(1)查看網頁源代碼
(2)查看源代碼內容
<ul> <li class="toctree-l1"><a class="reference internal" href="chapter1.html">第1章 前言</a></li> <li class="toctree-l1"><a class="reference internal" href="chapter2.html">第2章 關於Linux的歷史</a></li> <li class="toctree-l1"><a class="reference internal" href="chapter3.html">第3章 對Linux系統管理員的建議</a><ul> <li class="toctree-l2"><a class="reference internal" href="chapter3.html#id1">要安裝什麼版本的Linux操做系統</a></li> <li class="toctree-l2"><a class="reference internal" href="chapter3.html#id2">圖形界面仍是命令窗口</a></li> <li class="toctree-l2"><a class="reference internal" href="chapter3.html#id3">養成安全嚴謹的習慣</a></li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="chapter4.html">第4章 安裝Linux操做系統</a><ul> <li class="toctree-l2"><a class="reference internal" href="chapter4.html#id1">安裝虛擬機</a></li> <li class="toctree-l2"><a class="reference internal" href="chapter4.html#id3">下載Linux操做系統鏡像文件</a></li> <li class="toctree-l2"><a class="reference internal" href="chapter4.html#centos">安裝CentOS (圖形化安裝)</a></li> <li class="toctree-l2"><a class="reference internal" href="chapter4.html#id6">安裝CentOS (文本模式安裝)</a></li> </ul> </li>
和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
... ...
經過 https://regex101.com/ 正則網站,把須要的字段給過濾出來
<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"(.*)\">.*<\/a><\/li>
具體實現代碼以下
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2018/6/8 15:28 # @Author : zhouyuyao # @File : demon1.py import os import re import pdfkit import requests if not os.path.exists("aminglinux"): os.mkdir("aminglinux") os.chdir("aminglinux") url = "http://www.apelearn.com/study_v2/" s = requests.session() text = s.get(url).text reg = re.compile(r'<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"(.*)\">.*<\/a><\/li>') result = reg.findall(text) res = list(set(result)) def html_to_pdf(): for i in res: purl = "{0}{1}".format(url, i) print(purl) pdfFileName = i.replace("html", "pdf") print(pdfFileName) config = pdfkit.configuration(wkhtmltopdf=r"d:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe") try: pdfkit.from_url(purl, pdfFileName, configuration=config) except: continue if __name__ == '__main__': html_to_pdf()
運行以後將獲得一個文件夾,內容是所選取網站目錄下的全部 html 轉換成 PDF 的文件
1. https://www.cnblogs.com/yanglang/p/7126660.html Python處理csv文件
2. https://blog.csdn.net/u010189241/article/details/39449847 Windows環境下Python代碼的文件路徑問題
3. https://blog.csdn.net/ko_tin/article/details/72627266 Python CSV Reader/Writer/DictReader/DictWriter例子
4. https://blog.csdn.net/u014234300/article/details/51221272 Python處理Excel(一):Excel的簡單處理
5. https://www.cnblogs.com/chrischeng/p/7050027.html Python處理Excel文件
7. http://blog.51cto.com/286577399/2062339 Python 數據處理