一、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:\Python27\Scripts\djangotest\justtest.py
print os.path.dirname(os.path.dirname(__file__) #获取当前文件所在目录的上级目录C:\Python27\Scripts
print os.path.dirname(__file__) #获取当前文件所在目录C:\Python27\Scripts\djangotest
print os.getcwd() #获取当前文件目录 C:\Python27\Scripts\djangotest
print os.path.dirname(r'd:\workspace\R') #获取指定目录的上级目录d:\workspace
#获取相对路径
print os.path.basename(__file__) #获取当前文件名称 justtest.py
print os.path.basename(r'd:\workspace\R') #获取指定目录的相对路径,即当前目录名:R
#获取绝对路径
print os.path.abspath(__file__) #获取当前文件的绝对路径C:\Python27\Scripts\djangotest\justtest.py
print os.path.abspath(r'd:\workspace\R') #获取指定目录的绝对路径d:\workspace\R
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使用\r\n,linux使用\n,mac使用\ros.path.split()返回一个路径的目录名和文件名 os.path.split('c:\python27\abc.txt') ('c\python27','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:\python\a.txt'os.path.basename(path)返回文件名,path填入文件名或路径名os.path.basename('c:\python27\a.txt')->'a.txt'os.path.dirname(path)返回路径名os.path.dirname('c:\python\a.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+'\n') ->默认输出到控制台 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:\text\somefile.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() 所有的字符串写入文件,包括换行符 \n(linux) \r(mac) \r\n(windows)符号用来换行 --------由os.linesep决定
3.5 关闭文件
方法1
f.close()
方法2
with open('file.txt') as somefile:
do_something(somefile) #执行完with语句后会自动关闭文件
3.6 关于换行
Unix文件中的换行用\n表示
Windows文件中的换行用\r\n表示
Mac文件中的换行用\r表示
unix/mac中的文件在windows中打开,所有文字会变成一行
windows中的文件在unix/mac中打开,每行行尾多出一个^M符号
例子
f=open('/tmp/x','w+')
f.tell() 输出当前位置 0
f.wirte('test line\n') 写入字符串
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:\\Daisy\GDCAuto\\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,数值等于1mySheet.write(2, 1, 1) #写入B3,数值等于1mySheet.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, 0while 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 = 0while 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()两个路径名是否指向同个文件
转载于:https://www.cnblogs.com/zz27zz/p/7489287.html