• day9笔记--文件操作


    文件操作 

    计算机系统分为:计算机硬件,操作系统,应用程序三部分。

     

    我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。

    读    1.、找到文件 2、打开文件  3、操作:读 写  4、关闭

    #open打开文件是依赖了操作系统的提供的途径
    #操作系统有自己的编码,open在打开文件的时候默认使用操作系统的编码
    #win gbk  mac/linux utf-8
    
    f = open('歌词','w',encoding='utf-8')    #f:文件操作符 文件句柄 文件操作对象
    a = f.write('7018201890')   #  a =10 数字,写入的长度
    print(a,type(a))
    print(f,type(f))              #_io.TextIOWrapper name='歌词' mode='w' encoding='utf-8' windows的对应该文件的指针  class '_io.TextIOWrapper'
    f.close()
    
    #找到文件详解:文件与py的执行文件在相同路径下,直接用文件的名字就可以打开文件
                #文件与py的执行文件不在相同路径下,用绝对路径找到文件
    #文件的路径,需要用取消转译的方式来表示:1.\ 2.r''
    #如果以写文件的方式打开一个文件,那么不存在的文件会被创建,存在的文件之前的内容会被清空  w 模式有清空效果
    #习惯叫 f file f_obj f_handler fh   句柄的名字
    # print(f.writable())   #判断文件是否可写
    # print(f.readable())   #判断文件是否可读
    # f.write('7018201890')  #写文件的时候需要写数字,需要把数字转换成字符串
    # f.write('aasjgdlwhoojfjdaj')
    # f.write('iq349jdsh
    ')
    # f.write('aks')
    # f.write('
    sdgawo')     #文件的换行
    # f.write('天道酬勤')     #utf-8 unicode gbk
    #f.close()
    #关闭文件详解
    #操作系统级别的关闭文件资源:f.close()        必须写
    #del f主动释放了一个python程序内存中的变量  可写可不写

    f = open('歌词','r',encoding='utf-8')    #f:文件操作符 文件句柄 文件操作对象
    # 一次性读出
    # content = f.read()                        # read 默认会把文件中所有内容默认一次性全部读出,但是文件过大会造成内存占用过大甚至溢出
    # print(content)
    #一次读一部分
    # f.seek(15)            # seek 移动光标到某个位置
    # content = f.read(1)    #read 后加字符数 注:回车符占一个字符= 2个字节 window中换行默认是
    
    # print(f.tell())        # 光标移动到某个位置  seek(f.tell)
    # print(content)
    #按照行读,每次执行readline就会往下读一行
    # content = f.readline()
    # print('readline : ',content.strip())    #strip去掉空格、制表符、换行符
    # content2 = f.readline()
    # print(content2.strip())    # 一次读取一行   print 带的有回车,所以去掉行末的回车,如果不想让print换行,可以加上end=''  等,以什么结尾
    #4.读文件的第四种方式:readlines,返回一个列表,将文件中的每一行作为列表中的每一项返回一个列表
    # content = f.readlines()
    # print(content)  #将文件的每一行作为元素创建成列表   ,换行符在上边。占用内存
    #最常用的是用for 循环操作
    for line in f:
        f.seek(0)
        print(line.strip())
    # 不占 内存。   用strip将回车符去掉。
    #  read, readline ,readlines  都从光标位置读气,光标走过的将不再读出   for 循环中,seek有效
    f.close()
    f = open('shoplist',encoding='utf-8') #读文件并整理成需要的数据类型
    goods_list = []
    for line in f:
        if line.strip():
            goods_dic = {'name':None,'price':None}
            line = line.strip()
            goods_lst = line.split()
            print(goods_lst)
            goods_dic['name'] = goods_lst[0]
            goods_dic['price'] = goods_lst[1]
            goods_list.append(goods_dic)
    print(goods_list)
    f.close()
    
    f = open('shoplist',encoding='utf-8')    #只显示文件中有内容的行
    goods_list = []
    for line in f:
       if line.strip():
           print(line.strip())
    f.close()
    文件练习,购物车模型

    读写  r+  w+ a+

    #写入
    #a+
    # f = open('shoplist','a+',encoding='utf-8')
    # print(f.readable())
    # f.write('
    computer 6000 5')
    # f.write('
    computer 6000 5')
    # f.write('
    computer 6000 5')
    # f.write('
    computer 6000 5')
    # f.close()
    # with open('歌词', 'r+',encoding='utf-8') as f1:
    #     print(f1.read(4))
    #     print(f1.tell())
    #     f1.seek(f1.tell())
    #     f1.write('a')     # r+ 模式可读可写,如果先读的话,那么写的话只会在最后边。如果想让他回到读的位置写,那么使用seek(f.tell()),
                            #注:此时的写入是覆盖式的写入,会破坏后边完整的字节 如果文件不存在不能读也不能r+
         #    r+  可读可写:
        #2.先写后读:从头开始写
    # with open('歌词', 'r+', encoding='utf-8') as f1:
    #
    #     f1.write('abc')
    #     f1.seek(0)
    #     print(f1.read())      # 写过后的字节将不可再读
    
    
    # w+  可写可读:一上来文件就清空了,
    # 尽管可读:1.但是你读出来的内容是你这次打开文件新写入的
              # 2.光标在最后,需要主动移动光标才可读
    # f = open('歌词','w+',encoding='utf-8')
    # f.write('中')
    # f.write('及哈哈哈')
    # f.seek(0)
    # f.write('a')
    # print(f.read())
    # f.close()      # 移动seek光标去写,也是覆盖
    #a+  追加可读         移动光标无效   只能最后追加去写
    f = open('歌词','a+',encoding='utf-8')
    f.seek(0)
    f.write('a')
    f.close()
    #一般情况下:文件操作,要么读,要么写,很少会用到读写、写读同时用的
    #常用的:
    #r、w、a
    #rb、wb、ab,不需要指定编码了
    #
    # f = open('歌词','rb')
    # content = f.read()
    # f.close()
    # print(content)
    # f2 = open('歌词2','wb')
    # f2.write(content)
    # f2.close()
    由于历史的原因,换行符在不同的系统中有不同模式,比如在 unix中是一个
    ,而在windows中是‘
    ’,用U模式打开文件,就是支持所有的换行模式,也就说‘
    ’ '
    ' '
    '都可表示换行
    t是windows平台特有的所谓text mode(文本模式),区别在于会自动识别windows平台的换行符。

    光标位置   seek(0,2)  seek(0)

    f = open('歌词','r+',encoding='utf-8')
    f.readlines()
    for line in f:
        print(line)              #  此时是空的,光标走过的位置不再读,这个是通用的,truncate 和 a 模式的写不受影响
    
    #seek 光标移动到第几个字节的位置
    # f.seek(0)    移动到最开始
    # f.seek(0,2)  移动到最末尾
    #f.truncate(3)  #从文件开始的位置只保留指定字节的内容
    f.truncate(2)   # 需要加参数,从文件开头保留几个字节
    # f.write('我可写了啊')
    #tell 告诉我光标在第几个字节
    #seek移动光标到指定位置
    # content = f.readline()
    # print(content.strip())
    #tell告诉你当前光标所在的位置
    # print(f.tell())
    # f.seek(4) #光标移动到三个字节的地方‘
    ’
    # content = f.read(1)   #读一个字符
    # print('***',content,'***')
    # content = f.readline()
    # print(content.strip())
    # print(f.tell())
    f.close()
    #seek:去最开始、去最结尾
    #truncate:保留n个字节   不受seek干扰
  • 相关阅读:
    System.Web.Mvc.RoutePrefixAttribute.cs
    HTML5: 实现调用系统拍照或者选择照片并预览
    System.DateTime.cs
    System.Math.cs
    System.Web.UI.WebControls.FileUpload.cs
    系统过程分析
    java实现数字黑洞
    java实现数字黑洞
    java实现数字黑洞
    java实现数字黑洞
  • 原文地址:https://www.cnblogs.com/zjchao/p/7757687.html
Copyright © 2020-2023  润新知