zoukankan      html  css  js  c++  java
  • Python文件操作(txtxlsxcsv)及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: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() 两个路径名是否指向同个文件  

     

  • 相关阅读:
    Django【二】自定义web框架
    Django【一】web框架的本质
    Django【零】HTTP协议
    【前端】bootstrap引入
    【前端】jquery基础学习
    socket模块粘包现象理解以及解决思路
    面向对象编程学习笔记
    socket模块
    CPU缓存体系对Go程序的影响
    测试Go代码 单元测试
  • 原文地址:https://www.cnblogs.com/zz27zz/p/7489287.html
Copyright © 2011-2022 走看看