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 数据处理