zoukankan      html  css  js  c++  java
  • python初学--文件操作、字典

    文件读写
    1、先打开文件
    2、读取/写入内容
    3、保存文件
     
    文件的open模式有三种
    1、w 写模式,它是不能读的 只要用w打开文件,文件中的东西都会被清空
    w+, 写读模式,只要沾上w 就会清空原来的文件
    2、r 读模式,只能读,不能写,而且文件必须存在
    r+ 读写模式,只要沾上r 文件必须存在 不存在就会报错
    3、a 追加模式,也能写 这种模式,打开文件后直接定位到文件的末尾,然后开始追加,所以会用到 .seek(0)得方法
    a+
    rb+ wb+
     
    f=open('a.txt222','a+',encoding='utf-8')
    f.seek(0) #a+模式,指针定位在末尾,使用.seek(0)可以将指针定位带最前面
    print(f.read()) #read:返回的是字符串 读取的是整个文件 效率低
    print(f.readlines()) #readlines:返回的是一个列表 通常用来读取配置文件 read和readlines读取的是整个文件 效率低
    f.seek(0)
    print(f.readline()) #readline方法:返回的是字符串 每次只读取一行数据 效率高
     
    如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便:
     
    f=open(‘a.txt’)
    如果在打开文件的时候不指定模式,那就是默认读模式
     
    f=open('a.txt','r',encoding='utf-8')
    print(f.read())
     
    #直接循环的时候循环的是文件的每一行 比read和readlines的效率高些
    count=1
    for line in f:
    print('第%s行:%s'%(count,line))
    count+=1
     
     
    --------------------------------------------------------------
    write #写文件的的时候,只能是写字符串
    f.writelines(['123','456','789']) #可以吧列表写到里头 list每个元素是文件的每一行
    # f.write('jmysdfsdf')#write是写内容,只能写字符串
     
     
    调用read()会一次性读取文件的全部内容,如果文件有10G,内存就爆了,所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。另外,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。因此,要根据需要决定怎么调用
     
    三、用linecache读取文件内容(测试过1G大小的文件,效率还可以)
    str = linecache.getlines(filename)
    str为列表形式,每一行为列表中的一个元素
    ------------------------------------
    其他操作:
      f = open('file.txt','r+',encoding='utf-8')#encoding参数可以指定文件的编码
                f.readline()#读一行
                f.readable()#判断文件是否可读
                fr.writable()#判断文件是否可写
                fr.encoding#打印文件的编码
                f.read()#读取所有内容,大文件时不要用,因为会把文件内容都读到内存中,内存不够的话,会把内存撑爆
                f.readlines()#读取所有文件内容,返回一个list,元素是每行的数据,大文件时不要用,因为会把文件内容都读到内存中,内存不够的话,会把内存撑爆
                f.tell()#获取当前文件的指针指向
                f.seek(0)#把当前文件指针指向哪
                f.write('爱情证书')#写入内容
                f.fulsh()#写入文件后,立即从内存中把数据写到磁盘中
                f.truncate()#清空文件内容 只清空指针之后得文件内容 所以一般需要用到f.seek(0)
    f.truncate([size])                 #把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置
                f.writelines(['爱情证书','孙燕姿'])#将一个列表写入文件中
                f.close()关闭文件
     
    --------------------------------------------------------------------
    文件操作练习题:
    二、文件操作方法大全:
    1.os.mknod("test.txt")             #创建空文件
    2.fp = open("test.txt",w)          #直接打开一个文件,如果文件不存在则创建文件
    3.关于open 模式:
     
    fp.read([size])                     #size为读取的长度,以byte为单位
    fp.readline([size])                 #读一行,如果定义了size,有可能返回的只是一行的一部分
    fp.readlines([size])                #把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
    fp.write(str)                       #把str写到文件中,write()并不会在str后加上一个换行符
    fp.writelines(seq)                  #把seq的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西。
    fp.close()                          #关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。  如果一个文件在关闭后还对其进行操作会产生ValueError
    fp.flush()                          #把缓冲区的内容写入硬盘
    fp.fileno()                         #返回一个长整型的”文件标签“
    fp.isatty()                         #文件是否是一个终端设备文件(unix系统中的)
    fp.tell()                           #返回文件操作标记的当前位置,以文件的开头为原点
    fp.next()                           #返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。
    fp.seek(offset[,whence])            #将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。
    fp.truncate([size])                 #把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
    --------------------------------------------------------------------
    # 1.打开一个文件
    #2、读取整个文件,返回字符串
    #3、读取一行
    #4、读取整个文件,返回列表
    #5、写入字符串
    #6、写入非int类型的列表
    # 7.清空文件
    # 8.关闭文件
     
    ****************************************************************************
    字典:
    字典(1、字典是无序的 2、key:value #key不能重复)
    info={
    'name':'lzc',
    'sex':'nan',
    }
    (一)查询
    print(info)
    print(info['name'])
    print(info['addr'])
    print(info.get('addr','没有取到值'))
    1、用中括号和get取值的方法区别,如果get方法取不到key时,不会报错,但是中括号取值不到就会报错
    2、get方法还可多传一个参数,如果get不到值key的话,那么返回xx,如果不写默认返回none
     
    (二)添加
    1、info['addr']='beijing'
    print(info)
    2、info.setdefault('phone',123243444)
    print(info)
    (三)修改
    info['age']=7 #有这个字段的时候是修改 没有这个字段的的时候是新增
    print(info)
    (四)删除
    1、del info['age']
    print(info)
    2、print(info.pop('name')) #必须要指定key 返回的是删除的字段的值
    3、info.clear() 清空字典
    4、info.popitem() 随机删除一个元素
     
    请务必注意,dict内部存放的顺序和key放入的顺序是没有关系的。
    和list比较,dict有以下几个特点:
    1. 查找和插入的速度极快,不会随着key的增加而变慢;
    2. 需要占用大量的内存,内存浪费多。
    而list相反:
    1. 查找和插入的时间随着元素的增加而增加;
    2. 占用空间小,浪费内存很少。
    所以,dict是用空间来换取时间的一种方法。
     
    需要牢记的第一条就是dict的key必须是不可变对象
    这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。
    要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key:
     
    字典键的特性
    字典值可以没有限制地取任何python对象,既可以是标准的对象,也可以是用户定义的,但键不行
    1)不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住
    2)键必须不可变,所以可以用数字,字符串或元组充当,所以用列表就不行
    ----------------------------------------------------------------
    字典练习:
    user={'name':'niuhany','age':18}
    #字典取值的方式1 方式2
    # print(user['name'])
    # print(user.get('name'))
    # 字典修改值方式1 方式2
    # user['name']='lzc'
    # user.update(name='haha')
    # print(user)
     
    # 给字典增加值的方式1 方式二
    # user['addr']='huilongguang'
    # user.setdefault('sex','nan')
    # print(user)
     
    # 删除值的方式1,方式2 删除随机值
    # del user['name']
    # user.pop('age')
    # user.popitem()
    # print(user)
     
    print(user.items())
    for k,v in user.items(): #同时循环k和value
    print("%s=%s"%(k,v))
    for k in user:
    print("%s=%s"%(k,user[k]))
     
    # 判断一个字典在不在字典里面
    user={'name':'lzc',
    'aes':'nan'}
    if 'name' in user:
    print(True)
     
     
  • 相关阅读:
    Cg(C for Graphic)标准函数库之数学函数与几何函数
    小技巧总结
    MVC学习笔记
    HTML5 ajax上传附件
    JS:公历、农历互转
    JS:中文GB2312编码
    Oracle:递归查询(树形结构数据)
    oracle:自定义多行合并聚合函数
    编写一个可配置的网页信息提取组件 (二)—— 优雅的.net core 配置系统
    编写一个可配置的网页信息提取组件
  • 原文地址:https://www.cnblogs.com/zunchang/p/7638143.html
Copyright © 2011-2022 走看看