一、OS模块
os模块用来直接调用操作系统提供的接口函数,进而操作文件和目录。
1.1 常用路径的方法
sys.path[
0
] 是指运行main的路径,就是主路径
os.path.dirname(os.path.abspath("__file__")) 当前运行文件的路径
os.path.dirname(__file__) 当前运行文件的路径
os.path.dirname(os.path.realpath(sys.argv[0])) linux系统下表示当前运行文件的路径
os.path.pardir 上一级目录
os.path.join(path,'filename') 组合路径和文件名 形成文件路径
sys.path.append()
- 备注:假设a.py中有表示路径的方式,main.py为主调动模块,当main.py调用a.py时,a.py中表示的路径则应该以main.py为标准而不是以a.py为标准
import os
#当前文件的完整路径名:C:Python27Scriptsdjangotestjusttest.py print os.path.dirname(os.path.dirname(__file__) #获取当前文件所在目录的上级目录C:Python27Scripts print os.path.dirname(__file__) #获取当前文件所在目录C:Python27Scriptsdjangotest print os.getcwd() #获取当前文件目录 C:Python27Scriptsdjangotest print os.path.dirname(r'd:workspaceR') #获取指定目录的上级目录d:workspace #获取相对路径 print os.path.basename(__file__) #获取当前文件名称 justtest.py print os.path.basename(r'd:workspaceR') #获取指定目录的相对路径,即当前目录名:R
#获取绝对路径 print os.path.abspath(__file__) #获取当前文件的绝对路径C:Python27Scriptsdjangotestjusttest.py print os.path.abspath(r'd:workspaceR') #获取指定目录的绝对路径d:workspaceR
os.name | 输出字符串指示正在使用的平台,window用nt表示,Linux/unix用posix表示 | |
os.getcwd() | 得到当前工作目录,即当前python脚本工作的目录路径 | |
os.listdir() | 返回指定目录下的所有文件和目录名,返回列表[] | os.listdir(os.getcwd()) |
os.remove() | 删除一个文件 | |
os.system() | 运行shell命令 | os.system('dir') os.system('cmd') |
os.sep | 可以取代操作系统特定的路径分割符 | windows |
os.linesep | 字符串给出当前平台使用的行终止符 | windows使用 ,linux使用 ,mac使用 |
os.path.split() | 返回一个路径的目录名和文件名 |
os.path.split('c:python27abc.txt') ('cpython27','abc.txt') |
os.path.isfile()/os.path.isdir() | 分别检验出路径是一个文件还是目录,返回布尔值 |
os.path.isdir(os.getcwd()) os.path.isfile('a.txt') |
os.path.exists() | 检验给出的路径是否真实存在,返回布尔值 | os.path.exists('c:python27') |
os.path.abspath(name) | 获得绝对路径 | |
os.path.normpath(path) | 规范path字符串形式 | |
os.path.getsize(name) | 获得文件大小,如果name是目录返回0L | |
os.path.splitext() | 分离文件名与扩展名 | os.path.splitext('a.txt')-> ('a','.txt') |
os.path.join(path,name) | 连接目录与文件名或目录 | os.paht.join('c:python','a.txt')->'c:pythona.txt' |
os.path.basename(path) | 返回文件名,path填入文件名或路径名 | os.path.basename('c:python27a.txt')->'a.txt' |
os.path.dirname(path) | 返回路径名 | os.path.dirname('c:pythona.txt')->'c:python' |
二、标准OS流
stdin, stdout, stderr在Python中都是文件属性的对象,他们在Python启动时自动与Shell环境中的标准输入,输出,出错 关联。
sys.stdin 标准输入
sys.stdout 标准输出
sys.stderr 错误输出
1.sys.stdin 数据输入标准源
2.sys.stdout 数据一般出现在屏幕上
3.sys.stderr 错误信息,如栈追踪
print obj ->实际上是-> sys.stdout.write(obj+' ') ->默认输出到控制台 sys.stdout=__cosole__
->重定向输出 f=open('out.log','w') sys.stdout=f
input()/raw_input('promtion') ->实际上是-> print 'promotion'
sys.stdin.readline()[:-1]
3.管道输出
stdin 标准输入(键盘)
stdout 标准输出(缓冲输出到显示器)
stderr 标准错误 (非缓冲输出到屏幕)
在一个命令后面续写其他的多个命令,管道符号| 将一个命令的标准输出和下一个命令的标准输入连在一起
$cat file.txt | python script.py | sort
cat file.tex【 标准输出(sys.stdout)】--->script.py读取【file.txt写入的】再输出【sys.stdout】--->sort得到script.py输出的数据,再输出
管道script.py 会从它的sys.stdin中读取数据(file.txt写入的),并把结果写入sys.stdout(sort在此得到数据)
三、操作文件
3.1 打开文件
open()内建函数,返回一个文件对象,open()和file()功能相同
3.1.1定义
open(name[,mode[,buffering]]) #name为文件名, mode模式和buffering缓冲为可选
3.1.2 解释定义
mode模式 ===》'r','w','a','b','+'分别为读(默认模式)、写(先清空再写入)、追加、二进制访问、读写
rU -> 以读方式打开,同时提供通用换行符支持
bufferring ===》 0或False-无缓冲,直接针对硬盘
1或True-有缓冲,使用内存代替硬盘
大于1的数字-缓冲区的大小
任意负数或不提供-使用默认的缓冲区大小
3.1.3例子
f=open(r'C: extsomefile.txt') #打开某路径下的txt文件,以读方式打开
3.2 写入
f=open('file.txt','w')
f.write('Hello') #所提供的参数string会被追加到文件中已存在部分的后面
f.write('world!')
f.close
3.3 读取
f=open('file.txt','r') #可以省略r,因为r是默认的模式
f.read(4) #读取四个字符,返回读取的值
f.read() #读取剩余的字符,返回剩余的值
f.read(-1) #读取所有
f.read() #读取文件中的所有字符,返回字符串形式
3.4 读写行
x=f.readline() 读取一行,带数字参数则返回读取的字符的最大值
x=f.readline(-1) 读取所有行
x=f.readlines() 读取文件的所有行并返回包括换行符,返回的是字符串列表,x[0]为第一行内容
x=f.writelines() 所有的字符串写入文件,包括换行符 (linux) (mac) (windows)符号用来换行 --------由os.linesep决定
3.5 关闭文件
方法1
f.close()
方法2
with open('file.txt') as somefile:
do_something(somefile) #执行完with语句后会自动关闭文件
3.6 关于换行
Unix文件中的换行用 表示
Windows文件中的换行用 表示
Mac文件中的换行用 表示
unix/mac中的文件在windows中打开,所有文字会变成一行
windows中的文件在unix/mac中打开,每行行尾多出一个^M符号
例子
f=open('/tmp/x','w+')
f.tell() 输出当前位置 0
f.wirte('test line ') 写入字符串
f.tell() 输出光标当前位置10
f.seek(-6,1) 光标往前6个字符得长度
f.readline() 读取行
f.close()
.read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中
.readlines() 一次读取整个文件(类似于 .read()
.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for ... in ... 结构进行处理.
.readline() 每次只读取一行,通常比 .readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 .readline()。
四、操作excel
读取excel文件可以用两个模块xlrd(读取)和xlwt(写入)即可
4.1 安装xlrd
方法1、到python官网http://pypi.python.org/pypi/xlrd下载模块。下载的文件例如:xlrd-0.9.3.tar.gz。解压放到python27/Lib/site-packages目录下
方法2、用命令安装 easy_install xlrd或者pip install xlrd
4.2 使用xlrd
4.2.1 导入模块
import xlrd
4.2.2 打开excel
myWorkbook=xlrd.open_workbook('D:\DaisyGDCAuto\testfile\testData.xls')
4.2.3 获取excel工作表
mySheets=myWorkbook.sheets() #获取工作列表,获取表格中所有sheet,通过索引顺序获取,所有sheet中的第一个sheet
mySheet = mySheets[0]
mySheet = myWorkbook.sheet_by_index(0) #通过索引顺序获取,获取到表格中第一个sheet
mySheet = myWorkbook.sheet_by_name(u'Sheet1') #通过名称获取,获取到表格中的sheet名称为xxx的sheet
4.2.4 获取行数
nrows=mySheet.nrows #获取sheet中的行数
ncols=mySheet.ncols #获取sheet中的列数
4.2.5 获取一行和一列的数据
myrow=mySheet.row_values(i) #i为行数,从0开始计数,返回list对象
mycol=mySheet.col_values(i) #i为列数,从0开始计数,返回list对象
4.2.6 读取单元格的数据
mycell=mySheet.cell(i,j) #获取行数i,列数j的单元格
mycellvalue=mycell.value #获取单元格的数据
myCellValue = mySheet.cell_value(i, j) #直接获取单元格数据
value=mySheet.cell_value(1,0).encode('utf-8') #以utf-8格式读取
4.2.7 读取日期格式的数据 1990/01/07
date_value=xlrd.xldate_as_tuple(sheet.cell_value(1,2),myWorkbook.datemode) //(1990,1,7,0,0,0)
date(*date_value[:3]) //datetime.date(1990,1,7)
date(*date_value[:3]).strftime('%Y%m%d') //'1990/01/07'
python读取excel中单元格的内容返回有5种类型的数据ctype
0:empty
1:string
2:number
3:date
4:boolean
5:error
即date的ctype=3
if (sheet.cell(row,col).ctype == 3):
date_value = xlrd.xldate_as_tuple(sheet.cell_value(1,3),myWorkbook.datemode)
date_tmp = date(*date_value[:3]).strftime('%Y/%m/%d')
4.2.8 读取合并单元格内容
只能获取合并单元格的第一个cell的行列索引,才能读到值
读取好朋友:sheet2.col_values(4)[1]
读取暂无:sheet2.row_values(7)[2]
获取合并的单元格:
读取文件的时候需要将formatting_info参数设置为True,默认是False
workbook = xlrd.open_workbook(r'F:demo.xlsx',formatting_info=True)
sheet2 = workbook.sheet_by_name('sheet2')
sheet2.merged_cells //返回[(7, 8, 2, 5), (1, 3, 4, 5), (3, 6, 4, 5)],(7, 8, 2, 5)的意思是第7行到7行,第2列到第4列合并为‘暂无’。
sheet2.cell_value(7,2) //返回(7, 8, 2, 5)合并的内容 ‘暂无’
4.3 安装xlwt
方法1、到python官网http://pypi.python.org/pypi/xlwt下载模块。下载的文件例如:xlwt-1.0.0.tar.gz。解压放到python27/Lib/site-packages目录下
方法2、用命令安装 easy_install xlwt或者pip install xlwt
4.4 使用xlwt
4.4.1 导入模块
import xlwt
4.4.2 创建Excel工作簿
myWorkbook=xlwt.Workbook()
4.4.3 添加excel工作表
mySheet = myWorkbook.add_sheet('A Test Sheet')
4.4.4 写入数据
myStyle = xlwt.easyxf('font: name Times New Roman, color-index red, bold on', num_format_str='#,##0.00') #数据格式
mySheet.write(i, j, 1234.56, myStyle)
mySheet.write(2, 0, 1) #写入A3,数值等于1
mySheet.write(2, 1, 1) #写入B3,数值等于1
mySheet.write(2, 2, xlwt.Formula("A3+B3")) #写入C3,数值等于2(A3+B3)
4.4.5 保存
myWorkbook.save('excelFile.xls')
4.4.6 高级使用方法
f = xlwt.Workbook()
sheet1 = f.add_sheet(u'sheet1',cell_overwrite_ok=True) #单元格有被覆盖的时候不会提示错误
row0 = [u'业务',u'状态',u'北京',u'上海',u'广州',u'深圳',u'状态小计',u'合计']
column0 = [u'机票',u'船票',u'火车票',u'汽车票',u'其它']
status = [u'预订',u'出票',u'退票',u'业务小计']
for i in range(0,len(row0)):
sheet1.write(0,i,row0[i],set_style('Times New Roman',220,True))
i, j = 1, 0
while i < 4*len(column0) and j < len(column0):
sheet1.write_merge(i,i+3,0,0,column0[j],set_style('Arial',220,True)) #第一列,i表示行,i+3中的3表示跨3行,0为列,column0[j]表示单元格内容
sheet1.write_merge(i,i+3,7,7) #最后一列"合计",
i += 4
j += 1
sheet1.write_merge(21,21,0,1,u'合计',set_style('Times New Roman',220,True))
i = 0
while i < 4*len(column0):
for j in range(0,len(status)):
sheet1.write(j+i+1,1,status[j])
i += 4
f.save('demo1.xlsx')
def set_style(name,height,bold=False):
style = xlwt.XFStyle() # 初始化样式
font = xlwt.Font() # 为样式创建字体
font.name = name # 'Times New Roman'
font.bold = bold
font.color_index = 4
font.height = height
style.font = font
return style
4.5 xlsxwriter模块
4.5.1 安装
pip install xlsxwriter
4.5.2 使用
import xlsxwriter
import xlsxwriter workbook = xlsxwriter.Workbook('hello.xlsx') # 建立文件 worksheet = workbook.add_worksheet() # 建立sheet, 可以work.add_worksheet('employee')来指定sheet名,但中文名会报UnicodeDecodeErro的错误 worksheet.write('A1', 'Hello world') # 向A1写入 workbook.close()
其他使用方法:
formatHeader=workbook.add_format()#添加一种格式
formatHeader.set_bg_color("yellow") #背景颜色变成黄色
formatHeader.set_bold() #把字体加粗
formatHeader.set_font_color('blue')#字体颜色变为蓝色
formatHeader.set_align("center")#文本居中
formatHeader.set_align("vcenter")
worksheet.write_row(0,0,[cat1,cat2,cat3],formatHeader)
worksheet.freeze_panes(1,0)
参考资料:https://xlsxwriter.readthedocs.io/contents.html
五、操作json文件
读取json文件
import json
f=open(''filepath","rb+")
content=json.loads(f.read())
f.close()
六、操作csv文件
6.1 定义
python中有一个读写csv文件的包,直接import csv即可。
csv文件的性质:
- 值没有类型,所有值都是字符串
- 不能指定字体颜色等样式
- 不能指定单元格的宽高,不能合并单元格
- 没有多个工作表
- 不能嵌入图像图表
在CSV文件中,以,
作为分隔符,分隔两个单元格。像这样a,,c
表示单元格a
和单元格c
之间有个空白的单元格。依此类推。
excel形式
存储为csv文件
假设上述csv文件保存为"A.csv",如何用Python像操作Excel一样提取其中的一列,即一个字段,利用Python自带的csv模块,有两种方法可以实现:
第一种方法使用reader函数,接收一个可迭代的对象(比如csv文件),能返回一个生成器,就可以从其中解析出csv的内容:比如下面的代码可以读取csv的全部内容,以行为单位: with open('A.csv','rb') as csvfile:
得到:
reader = csv.reader(csvfile)
rows= [row for row in reader]
print rows ['1', 'Apple', '12', '98'],
['2', 'Ben', '13', '97'],
['3', 'Celia', '14', '96'],
['4', 'Dave', '15', '95']]
要提取其中某一列,可以用下面的代码:with open('A.csv','rb') as csvfile:
得到:
reader = csv.reader(csvfile)
column = [row[2] for row in reader]
print column 注意从csv读出的都是str类型。这种方法要事先知道列的序号,比如Age在第2列,而不能根据'Age'这个标题查询。这时可以采用第二种方法:
第二种方法是使用DictReader,和reader函数类似,接收一个可迭代的对象,能返回一个生成器,但是返回的每一个单元格都放在一个字典的值内,而这个字典的键则是这个单元格的标题(即列头)。用下面的代码可以看到DictReader的结构:with open('A.csv','rb') as csvfile:
得到:
reader = csv.DictReader(csvfile)
column = [row for row in reader]
print column {'Age': '13', 'No.': '2', 'Score': '97', 'Name': 'Ben'},
{'Age': '14', 'No.': '3', 'Score': '96', 'Name': 'Celia'},
{'Age': '15', 'No.': '4', 'Score': '95', 'Name': 'Dave'}]
如果我们想用DictReader读取csv的某一列,就可以用列的标题查询:with open('A.csv','rb') as csvfile:
就得到:
reader = csv.DictReader(csvfile)
column = [row['Age'] for row in reader]
print column['12', '13', '14', '15']
读取行
方法一:reader
第一种方法使用reader函数,接收一个可迭代的对象(比如csv文件),能返回一个生成器,就可以从其中解析出csv的内容:比如下面的代码可以读取csv的全部内容,以行为单位:
import csv
with open('A.csv','rb') as csvfile:
reader = csv.reader(csvfile)
rows = [row for row in reader]
print rows
得到:
[['No.', 'Name', 'Age', 'Score'],
['1', 'Apple', '12', '98'],
['2', 'Ben', '13', '97'],
['3', 'Celia', '14', '96'],
['4', 'Dave', '15', '95']]
要提取其中第二行,可以用下面的代码:
import csv
with open('A.csv','rb') as csvfile:
reader = csv.reader(csvfile)
for i,rows in enumerate(reader):
if i == 2:
row = rows
print row
得到:
['2', 'Ben', '13', '97']
这种方法是通用的方法,要事先知道行号,比如Ben的记录在第2行,而不能根据’Ben’这个名字查询。这时可以采用第二种方法:
方法二:DictReader
第二种方法是使用DictReader,和reader函数类似,接收一个可迭代的对象,能返回一个生成器,但是返回的每一个单元格都放在一个字典的值内,而这个字典的键则是这个单元格的标题(即列头)。用下面的代码可以看到DictReader的结构:
import csv
with open('A.csv','rb') as csvfile:
reader = csv.DictReader(csvfile)
rows = [row for row in reader]
print rows
得到:
[{'Age': '12', 'No.': '1', 'Score': '98', 'Name': 'Apple'},
{'Age': '13', 'No.': '2', 'Score': '97', 'Name': 'Ben'},
{'Age': '14', 'No.': '3', 'Score': '96', 'Name': 'Celia'},
{'Age': '15', 'No.': '4', 'Score': '95', 'Name': 'Dave'}]
如果我们想用DictReader读取csv的某一列,就可以用列的标题查询:
import csv
with open('A.csv','rb') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
if row['Name']=='Ben':
print row
就得到:
{'Age': '13', 'No.': '2', 'Score': '97', 'Name': 'Ben'}
可见,DictReader很适合读取csv的的行(记录)。
最常用的一种方法,利用pandas包
import pandas as pd
#任意的多组列表
a = [1,2,3]
b = [4,5,6]
#字典中的key值即为csv中列名
dataframe = pd.DataFrame({'a_name':a,'b_name':b})
#将DataFrame存储为csv,index表示是否显示行名,default=True
dataframe.to_csv("test.csv",index=False,sep='')
a_name b_name
0 1 4
1 2 5
2 3 6
同样pandas也提供简单的读csv方法
import pandas as pd
data = pd.read_csv('test.csv')
会得到一个DataFrame类型的data,不熟悉处理方法可以参考pandas十分钟入门
另一种方法用csv包,一行一行写入
import csv
#python2可以用file替代open
with open("test.csv","w") as csvfile:
writer = csv.writer(csvfile)
#先写入columns_name
writer.writerow(["index","a_name","b_name"])
#写入多行用writerows
writer.writerows([[0,1,3],[1,2,3],[2,3,4]])
index a_name b_name
0 1 3
1 2 3
2 3 4
读取csv文件用reader
import csv
with open("test.csv","r") as csvfile:
reader = csv.reader(csvfile)
#这里不需要readlines
for line in reader:
print line
以上。
1. 读文件
csv_reader = csv.reader(open('data.file', encoding='utf-8')) for row in csv_reader: print(row)
例如有如下的文件
输出结果如下
['0.093700','0.139771','0.062774','0.007698']
['-0.022711','-0.050504','-0.035691','-0.065434']
['-0.090407','0.021198','0.208712','0.102752']
['-0.085235','0.009540','-0.013228','0.094063']
可见csv_reader把每一行数据转化成了一个list,list中每个元素是一个字符串。
2. 写文件
读文件时,我们把csv文件读入列表中,写文件时会把列表中的元素写入到csv文件中。
list = ['1', '2','3','4']
out = open(outfile, 'w') csv_writer = csv.writer(out) csv_writer.writerow(list)
可能遇到的问题:直接使用这种写法会导致文件每一行后面会多一个空行。
解决办法如下:
out = open(outfile, 'w', newline='') csv_writer = csv.writer(out, dialect='excel') csv_writer.writerow(list)
-------------------------------------------------------------------------------------------------------------
file.txt 内容为 your mother was a hamster and your father smelled of elderberries.
script.py内容为
import sys
text=sys.sdin.read()
words=text.split()
wordcount=len(words)
print wordcount
执行 file.txt | python script.py 的结果为11
os模块 是访问操作系统功能的主要接口,是文件系统操作的接口
os.path 支持路径名的操作
mkfifo()/mknod() | 创建命名管道/创建文件系统节点 | |
remove()/unlink() | delete file删除文件 | |
rename()/renames() | 重命名文件 | |
stat() | 返回文件信息 | |
symlink() | 创建符号链接 | |
utime() | 更新时间戳 | |
tmpfile() | 创建并打开一个新的临时文件 | |
walk() | 生成一个目录树下的所有文件名 | |
目录/文件夹 | ||
chdir()/fchdir() | 改变当前工作目录/通过一个额外你见描述符改变当前工作目录 | |
chroot() | 改变当前进程的根目录 | |
listdir() | 列出指定目录的文件 | |
getcwd()/getcwdu() | 返回当前工作目录/功能相同,但返回一个unicode对象 | |
mkdir()/makedirs() | 创建目录/创建多层目录 | |
rmdir()/removedirs() | 删除目录/删除多层目录 | |
访问/权限 | ||
access() | 检验权限模式 | |
chmod() | 改变权限模式 | |
chown()/lchown() | 改变owner和group id/功能相同,但不会跟踪链接 | |
umask() | 设置默认权限模式 | |
os.path模块 | ||
basename() | 去掉目录路径,返回文件名 | |
dirname() | 去掉文件名,返回目录路径 | |
join() | 将分离的各部分组合成一个路径名 | |
split() | 返回(dirname(),basename())元祖 | |
splitdrive() | 返回(drivename,pahtname)元祖 | |
splitext() | 返回(filename,extension)元祖 | |
信息 | ||
getatime() | 返回最近访问时间 | |
getctime() | 返回文件创建时间 | |
getmtime() | 返回最近文件修改时间 | |
getsize() | 返回文件大小 | |
查询 | ||
exists() | 指定路径文件或目录是否存在 | |
isabs() | 指定路径是否为绝对路径 | |
isdir() | 指定路径是否存在且为一个目录 | |
isfile() | 指定路径是否存在且为一个文件 | |
islink() | 指定路径是否存在且为一个符号链接 | |
ismount() | 指定路径是否存在且为一个挂载点 | |
samefile() | 两个路径名是否指向同个文件 |