Python處理csv、xlsx、pdf

1、csv文件的處理

CSV(Comma-Separated Values)即逗號分隔值,能夠用Excel打開查看。因爲是純文本,任何編輯器也均可打開。與 Excel 文件不一樣,CSV 文件中:html

  • 值沒有類型,全部值都是字符串
  • 不能指定字體顏色等樣式
  • 不能指定單元格的寬高,不能合併單元格
  • 沒有多個工做表
  • 不能嵌入圖像圖表

1.1 csv讀取數據

在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"… 由於反斜槓是轉義符,因此兩個"\\"就表示一個反斜槓符號 
  • 使用Python的raw string: r"c:\test.txt" … python下在字符串前面加上字母r,表示後面是一個原始字符串raw string,不過raw string主要是爲正則表達式而不是windows路徑設計的,因此這種作法儘可能少用,可能會出問題。

1.2 csv寫入數據

有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 和 DictWriter 對象

使用 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 文件顯示以下

2、Excel 的處理

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文件

2.1 讀取表單數據

1)按行取數據

#!/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]

2)按列取數據

#!/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]

3)建立新的並寫入,不修改

#!/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 文件就是一個工做簿。每一個工做簿中有一張或若干張工做表。

4)字體效果

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

#!/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 文件,在第三張表的第一行第二列新增內容,以下所示

5)處理超連接

#!/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 文件並打開它

3、PDF文件的處理

轉換成pdf的三種方法:

在工做中,會遇到把html文件轉換成pdf文件

python給咱們提供了pdfkit這個模塊,直接安裝使用就能夠了

這裏須要注意的是,爲了更好的處理,咱們須要在 Windows 上從  https://wkhtmltopdf.org/ 下載 wkhtmltopdf 應用,以便在代碼中進行調用 (Windows 上爲 exe 文件,Linux 上爲二進制文件)。

下面就來介紹一個pdfkit模塊的幾種用法

首先,咱們安裝該模塊:

pip install pdfkit

1)網頁轉換成 pdf(直接把 url 轉換成 pdf 文件)

import pdfkit
pdfkit.from_url('http://google.com', 'out1.pdf')

2) Html轉換成pdf

import pdfkit
pdfkit.from_file('test.html', 'out2.pdf')

3) 字符串轉換成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文件

6. https://www.xlwings.org/

7. http://blog.51cto.com/286577399/2062339 Python 數據處理

相關文章
相關標籤/搜索