IO操作

2017-08-13

IO编程

文件读写

读文件

  f = open("/home/username/test.txt", "r")  # 在内存中打开文件
  f.read()  # 一次性读取文件的全部内容
  f.close  # 关闭文件
  • 符号“r”表示读,默认读utf-8编码的文本文件,如果要读图片、视频等二进制文件,则用”rb”代替。
  • 如果文件不存在,会报IOError的错误。一旦出错,f.close()就不会被调用。最好的方式是用with语句来帮我们自动关闭文件。
    with open("/home/username/test.txt", "r") as f:
        print(f.read())
    
  • 对于大文件,不能一次性读取所有内容,可以反复调用read(size)方法,每次最多读取size字节的内容。或者调用readline()方法,每次读取一行内容;也可以调用readlines()方法,一次读取所有内容并按行返回一个list。
    for line in f.readlines():
        print(line.strip())  # strip()方法可以去掉首尾的空格。
    
  • 像open()函数返回的这种有个read()方法的对象,在Python中统称为file-like Object。除了file外,还可以是内存的字节流,网络流,自定义流等等。file-like Object不要求从特定类继承,只要写个read()方法就行。

  • 对于特定编码的文本文件,需要给open()函数传入encoding参数。

写文件

  with open("/home/username/test.txt", "w[b]") as f:
      f.write("Hello World!")
  • 只有文件关闭之后,对文件所作的更改才能保存到磁盘上。

操作文件和目录

常用的

  • os.path.join(“/home/username/test”, “test.txt”)
    • 拼接字符串,结果为/home/usrname/test/test.txt
    • 根据系统来确定拼接符是“/”(Linux)还是“\”(Windows).
    • 操作的是字符串,不需要真实的路径。
  • os.path.split(“/home/username/test.txt”)
    • 可拆分出文件名(或目录名)
    • 返回父目录和文件名或目录名,总共两个字符串。
    • 上面返回(“/home/username”, “test.txt”)
    • 字符串的split(arg)方法,是根据传入的原字符串中的字符拆分原字符串,返回多个字符串。
  • os.path.splitext(“filename.txt”)
    • 可拆分出后缀名
    • 返回(“filenam”,”.txt”)
  • os.path.exists(“/home/username/test.txt”)
    • 判断路径是否存在
  • os.path.abspath(“.”)
    • 查看当前目录的绝对路径
  • os.mkdir(“/home/usrname/newdir”)
    • 新建目录
  • os.makedirs(“/test01/test02/test03”)
    • 递归创建目录
  • os.rmdir(“/home/usrname/abandoneddir”)
    • 删除目录
  • os.rename(“/home/username/oldname”, “/home/usrname/newname”)
    • 重命名,要求第一个参数表示的路径真实存在,第二个表示的路径不存在。
    • 可以把原文件复制到新的地方,并可重命名。
  • os.remove(“/home/usrname/abandonedfile”)
    • 删除文件

操作excel

xlrd 读.xls或者.xlsx文件

import xlrd
import xlwt
import os
from xlutils.copy import copy

def readexcel():
    book = xlrd.open_workbook("/home/zj/桌面/test02allsimilarities.xls")
    # table = data.sheets()[0]
    sheet = book.sheet_by_index(0)  # 获取索引值为0的表单。
    # sheet = data.sheet_by_name("sheetname")  # 根据表单名获取表单。
    i = 1  # 索引都是从0开始的
    print(sheet.row_values(i))  # 返回包含第i+1行的值的list
    c = sheet.col_values(i)  # 返回包含第i+1列的值的list
    nrows = sheet.nrows  # 返回表单现有数据的行数
    ncols = sheet.ncols  # 返回表单现有数据的列数
    # print(ncols)
    cell_C4 = sheet.cell(3, 2).value  # 获取单元格C4的值,其索引为(4-3,2), C表示列的索引值。
    # print(cell_C4)
    cell_B3 = sheet.row(2)[1].value  # 根据行列来索引
    # print(cell_B3)
    # print(nrows)
    # cell_C4 = table.cell_value(3, 2)  # 获取单元格C4的值
    print(cell_C4)

def write_new_excel():
    workbook = xlwt.Workbook()  # 新建工作簿
    wsheet = workbook.add_sheet("sheetname")  # 添加工作表
    wsheet.write(1, 1, "单元格的值")  # 表单中写入新的值,这里可以设置相关的格式
    workbook.save("filename_path")  # 保存


def write_to_old_or_new_excel(filename_path):
    # 判断该工作不是否存在,不存在就新建一个工作簿,并添加新的表单。
    if not os.path.exists(filename_path):
        w = xlwt.Workbook()
        ws = w.add_sheet("sheetname")
        w.save(filename_path)
    rexcel = xlrd.open_workbook(filename_path)  # 打开工作簿
    wexcel = copy(rexcel)  # 复制工作簿,从打开的xlrd的Book变量中,拷贝到xlwt的Workbook变量中。
    wsheet = wexcel.get_sheet(0)  # 从Workbook变量中获得对应索引的表单,
    xlwt.write(2, 2, "value")  # 写数据
    rexcel.save(filename_path)  # 保存

操作json

常用操作

  • json.dumps(py_obj) — python对象编码成json格式
    • json.dumps(py_obj, indent=4) 格式化输出
  • json.loads(json_obj) — json格式解码成python对象
  • json.dump(py_obj, f_opened) — python对象写进json文件中
    • json.dump(py_obj, f_opened, indent=4) 格式化输出
  • json.load(f_opened) — 从json文件中解码出python对象