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使用\r
os.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,数值等于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()两个路径名是否指向同个文件 

 

 

 

转载于:https://www.cnblogs.com/zz27zz/p/7489287.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值