zoukankan      html  css  js  c++  java
  • python 文件

    f=open("a.txt","r",encoding="utf-8") #在我的D:/desk/python/project/day03目录下有a.txt文件
    data=f.read() print(data) #输出a.txt文件内容123abc #f.close() #关闭文件,回收操作系统级打开的文件 #del f #回收应用程序级的变量,Python会帮我们完成这个,可以不写这条命令

    绝对路径:从磁盘根目录下一层层查找 d:/sylar/呵呵.txt
         http文件,文件在服务器的地址

    相对路径:读的文件和py文件在同一路径下,同级文件夹直接输名字
         ../b/haha.txt ../返回上一级目录 ../../返回上两级目录
    with open("a.txt","r+") as f: data=f.read() print(data) #123456 f.write("abc") #a.txt中内容变为 123456abc,通常情况下write会清空原内容,但是因为这个是进行了读操作后写的,所以并没有清空,而是类似于追加,w+先读后写并不会有同样的效果 with open("a.txt","r") as read_f,open("b.txt","w") as write_f: data=read_f.read() #读a.txt write_f.write(data) #把data中内容写到b.txt中,这时创建一个b.txt文件,其内容为123456abc #文件句柄=open("文件路径","模式") #打开文件的模式有(默认为文本模式), #r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】 #w,只写模式【不可读;不存在则创建;存在则清空内容】 #a, 只追加写模式【不可读;不存在则创建;存在则只追加内容】 #2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式) #rb #wb #ab #注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码 #3,‘+’模式(就是增加了一个功能) #r+, 读写【可读,可写】 #w+,写读【可写,可读】 #a+, 写读【可写,可读】 #4,以bytes类型操作的读写,写读,写读模式 #r+b, 读写【可读,可写】 #w+b,写读【可写,可读】 #a+b, 写读【可写,可读】 #f=open("d:deskpythonprojectd.txt","w") #f.write("a") #打印出d.txt中的内容 read(3) 1. 文件打开方式为文本模式时,代表读取3个字符   2. 文件打开方式为b模式时,代表读取3个字节 ''' ''' dic={"name":"name","price":0,"amount":0} lis=[] s1=0 with open("price.txt","rb+") as f: # data=f.readlines() # li=data.strip() for line in f: #文件中迭代就是一行一行读,不必再使用lines了 li=line.strip().split() #print(len(li)) #print(li[len(li)-1]) dic["name"]=li[0] dic["price"]=int(li[1]) dic["amount"]=int(li[2]) #print(dic) dicnew=dic.copy() #这里用变量进行copy是有必要的,不然直接引用dic因为dic只有一个地址会导致列表中保存的dic全部是最后一次数据的dic lis.append(dicnew) #这里只能用append,不能用expend,expend会把字典中的键值单独作为元素加入列表 #print(lis) #lis.extend(dic) #下边是使用expend后lis的结果 # ['name', 'price', 'amount', 'name', 'price', 'amount', 'name', 'price', 'amount', 'name', 'price', 'amount', 'name', 'price', 'amount'] print(lis) #这是使用append的效果,是我们想要的效果,唯一的不足是name前面有"b"这个字符,这是读取文件出现的,现在还不知道怎么解决,等下来老师讲吧,好吧上完课后我知道了,因为我是使用rb+模式即字节模式打开的,所以出现了b ,使用r+模式打开就好了 #[{'name': b'apple', 'price': 10, 'amount': 3}, {'name': b'tesla', 'price': 100000, 'amount': 1}, {'name': b'mac', 'price': 3000, 'amount': 2}, {'name': b'lenovo', 'price': 30000, 'amount': 3}, {'name': b'chicken', 'price': 10, 'amount': 3}] for dic in lis: s=dic["price"]*dic["amount"] print(s) s1=s1+s print(s1) ''' ''' # print(line) #文件中迭代就是一行一行的读 # print(data) #123456 #f.write("abc")
    '''
    try.txt
    
    这是第一行内容
    这是第二行内容
    这是第三行内容
    '''
    
    with open("try.txt",encoding="utf-8") as f:
        ret1 = f.read()      # read() 读出来的是字符串
        f.seek(0)
        ret2 = f.readline()     #readline() 读出来的是一行内容作为字符串
        f.seek(0)
        ret3 = f.readlines()    #readlines() 读出来的是列表,每一行内容作为列表的元素,因为我们对列表的操作最为方便,所以readlines()最好用
        f.seek(0)
        for line in f:          #句柄f是迭代器,逐行进行迭代
            print(line)
    print(ret1,type(ret1))
    #这是第一行内容
    # 这是第二行内容
    # 这是第三行内容 <class 'str'>
    print(ret2,type(ret2))
    # 这是第一行内容
    # <class 'str'>
    print(ret3,type(ret3))
    # ['这是第一行内容
    ', '这是第二行内容
    ', '这是第三行内容'] <class 'list'>
    import os
    with open("../day07/day07/a.txt","r+",encoding="utf-8") as f1,  #  这里表示一行没有写完#当使用按字节读或者写时,不能写编码方式
        open("b.txt","w",encoding="utf-8") as f2:
        f1.read() #全部读取,光标指向最后,有一点要注意的是在文档中每一行末尾都有换行符,所以读取一行后需要使用strip()删除换行符
        f1.read(3) #读取3个字符,注意这里是字符不是字节
        f1.readline()  # 读一行,光标指向下一行的首个字符,有一点要注意的是在文档中每一行末尾都有换行符,所以读取一行后需要使用strip()删除换行符
        f1.readlines() #从光标所在位置开始一行一行的读,并把每一行的内容作为字符串保存在列表
        f1.write("测试") #深坑特别注意,在r+模式下. 如果读取了了内容. 不论读取内容多少. 光标显⽰示的是多少. 再写入或者操作⽂文件的时候都是在结尾进⾏的操作
        f1.flush()  #flush刷新,一般在写操作后都进行刷新,因为有些情况下是写在缓冲中的,不刷新可能显示不出来
        f1.seek(0) #使光标返回开头
        f1.seek(3) #光标返回开头移动3个字节,需要注意的因为中文的UTF-8编码一个中文是3个字节,所以如果是中文的话seek的字节数应当是3的倍数
        f1.seek(3,0) #光标返回开头后偏移3个字节
        f1.seek(0,2) #光标指向结尾
        f1.seek(0,1) #光标指向当前位置,第一个参数表示偏移量,第二个参数 0表示开头 1表示当前位置 2表示结尾,但只有第二个参数是0时才可以有偏移量,也就是只有seek(*,0) seek(0,1)seek(0,2)
        f1.truncate() #当给出n的值时,从开头截到n个字节,后面的内容不要;当n不存在时,从当前光标处开始截,光标后面的内容不要
        os.remove("a.txt")  #删除a.txt文件
        os.rename("b.txt","a.txt") #重命名
        #a+模式下, 不论先读还是后读. 都是读取不到数据的.
    
    with open("../day07/day07/b.txt","wb") as f2:     # ../返回上级目录 当使用字节方式进行读写时,不需要也不能写编码方式
        f2.write("中午给你".encode("utf-8"))        #encode 将字符串转化为字节
    #**************************************作业1*****************************
    # 1. 文件a.txt内容:每一行内容分别为商品名字,价钱,个数。
    # apple 10 3
    # tesla 100000 1
    # mac 3000 2
    # lenovo 30000 3
    # chicken 10 3
    # 通过代码,将其构建成这种数据类型:[{'name':'apple','price':10,'amount':3},{'name':'tesla','price':1000000,'amount':1}......] 并计算出总价钱。
    
    dic={"name":"name","price":0,"amount":0}
    lis=[]
    s1=0
    with open("price.txt","rb+") as f:
        for line in f:  # 文件中迭代就是一行一行读,不必再使用lines了
            li = line.strip().split()
            dic["name"] = li[0]
            dic["price"] = int(li[1])
            dic["amount"] = int(li[2])
            dicnew = dic.copy()
            lis.append(dicnew)
        print(lis)
    for dic in lis:
        s=dic["price"]*dic["amount"]
        #print(s)
        s1=s1+s
    print(s1)
    '''
    #************************************作业2*************************
    '''
    # 2,有如下文件:
    # -------
    # alex是老男孩python发起人,创建人。
    # alex其实是人妖。
    # 谁说alex是sb?
    # 你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。
    # ----------
    # 将文件中所有的alex都替换成大写的SB。
    import os
    
    with open('replace.txt',"r",encoding="utf-8") as read_f,open('replace1.txt','w',encoding="utf-8") as write_f:     #"r"可以省略不写
        for line in read_f:
            #print(line)
            line=line.replace('alex','SB')
            write_f.write(line)
    
    os.remove('replace.txt')
    os.rename('replace1.txt','replace.txt')
    '''
    contend = read_f.read()
    contend = contend.replace("alex","SB")
    write_f.write(contend)


    ''' #***************************day03课上作业*************************** #判断一个字符串是否为小数 s="-1231.2" flag1=0 flag2=0 for a in s: #print(a) if a!="-" and a!="." and not a.isdigit(): flag1=0 #要注意的是迭代的时候是一个字符一个字符进行循环的,所以flag的值是一直变化的,而对于小数的判断条件,是以整个字符串进行的,所以在这里用了两个for循环,并用了两个flag break else: flag1=1 if flag1: for a in s: if s.replace("-","").count(".")==1 and not s.replace("-","").startswith(".") and not s.replace("-","").endswith("."): flag2=1 #print(flag) if flag2: print("s是小数") else: print("s不是小数") ''' ''' #*******************************day03默写************* #使用while循环和for循环打印出输入的内容 s=input("你想输入的内容") count=0 while count<len(s): print(s[count]) count+=1 for a in s: print(a)
    # *****************内存中数据读写****************
    # 很多时候,数据读写不一定是文件,也可以在内存中读写,StringIO顾名思义就是在内存中读写str
    # 要把str写入StringIO,我们需要先创建一个StringIO,然后,像文件一样写入即可
    from io import StringIO
    f = StringIO()
    f.write('hello')
    f.write(' ')
    f.write('world!')
    print(f.getvalue())     # getvalue()方法用于获得写入后的str
    # hello world!
    
    from io import StringIO
    f = StringIO('Hello!
    Hi!
    Goodbye!')
    while True:
        s = f.readline()    # 和文件句柄一样,可以使用readline
        if s == '':
            break
        print(s.strip())
    # Hello!
    # Hi!
    # Goodbye!
    
    # StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO
    # BytesIO实现了在内存中读写bytes,我们创建一个BytesIO,然后写入一些bytes
    from io import BytesIO
    f = BytesIO()
    ret = f.write('中文'.encode('utf-8'))
    print(ret)  # 6 返回写入的字节数
    print(f.getvalue())
    # b'xe4xb8xadxe6x96x87'
    
    from io import BytesIO
    f = BytesIO(b'xe4xb8xadxe6x96x87')
    ret = f.read()
    print(ret,ret.decode('utf-8'))
    # b'xe4xb8xadxe6x96x87' 中文
  • 相关阅读:
    java 反射 invoke()的异常问题记录
    windows安装nginx可视化工具nginxWebUI
    Springboot+Mybatis+Clickhouse+jsp 搭建单体应用项目(三)(添加增删改查)
    Springboot+Mybatis+Clickhouse+jsp 搭建单体应用项目(二)(添加日志打印和源码地址)
    Springboot+Mybatis+Clickhouse+jsp 搭建单体应用项目(一)
    mac + docker+单击clickhouse+Dbeaver安装全套
    线程中使用for循环的add或remove方法的两种方案
    map数据按照list排序
    oracle dbca 【bug】:JAVA_JIT_ENABLED=false
    Ubuntu(Debian):apt-get:处理repository数字签名无效、过期、没有签名:即 如何强制 apt-get update?
  • 原文地址:https://www.cnblogs.com/perfey/p/9134181.html
Copyright © 2011-2022 走看看