python2csv文件操作_Python文件操作(txt\xlsx\csv)及os操作

一、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

你可能感兴趣的:(python2csv文件操作)