• 文件操作


    一、文件操作

     1、需要的参数:1、文件路径  2、编码方式:utf-8    3、动作(读、写、追加....)

    绝对路径下:

    f1=open(r'D:学习python.txt',encoding='utf-8',mode='r')  #默认是读的方式,mode可以不写
    content=f1.read()
    print(content)
    f1.close()

    f1叫文件句柄,文件对象,一般叫文件句柄的居多,不仅可以设置成file,f_handle,file_handle,f_obj,一般约定俗称用f1、f2,f1也是变量,特殊的变量。
    open打开的指令,不是python的指令,是windows的指令
    windows 默认编码方式gbk,linux默认编码方式utf-8,mac utf-8。


    分三步:

    1,打开文件,产生文件句柄。--就存放到内存中
    2,操作文件句柄。
    3,关闭文件。  --如果不关闭,就一直存在内存中

    r rb r+,r+b
    read read(n) readline readlines for 循环
    r :
    rb: 非文字类的文件的操作。
    unicode ---> bytes encode()
    bytes---> unicode decode()

    r+,r+b


    w
    1,没有文件,创建文件,写入内容
    2,将原文件所有内容清空,写入新内容。
    wb
    w+,
    w+b

     


    a ab a+,a+b
    seek tell truncates,wrateble,readable,等等。
    文件的改。

    相对路径:

    #相对路径
    f1=open('log1',encoding='utf-8') #mode可以默认不写,默认是read,文件操作,以读为准
    content=f1.readlines()
    print(content)
    f1.close()

    备注:pycharm创建的文件,默认格式是'utf-8'

    出现的错误:

    SyntaxError: (unicode error) 'unicodeescape' codec
    can't decode bytes in position 2-3: truncated UXXXXXXXX escape
    f1 = open(r'D:空姐护士老师主妇.txt', encoding='utf-8', mode='r')
    # f1 = open('D:\空姐护士老师主妇.txt', encoding='utf-8', mode='r')
    EncodeDecodeErorr: 编码错误。


    2、rb模式:非文字类的文字的操作(图片、视频等等)
    f1=open('log1',mode='rb')  #rb模式不需要写编码类型(不加encoding),rb就是bytes类型
    content=f1.read(6)
    print(content) #b'xe6x88x91xe6x98xaf'


    3、文件的读(5种方式)
    read:读取全部内容
    readline():一行一行读取,读到组合再读就该读空了
    readlines():


    readline():
    f1=open(r'D:学习python.txt',encoding='utf-8',mode='r')
    print(f1.readline()) #打印第一行内容
    print(f1.readline())  #打印第二行内容
    print(f1.readline()) #打印第三行内容
    print(f1.readline()) #打印第四行内容
    f1.close()


    readlines():  #将每一行作为列表的一个元素,并返回给这个列表
    f1=open(r'D:学习python.txt',encoding='utf-8',mode='r')
    print(f1.readlines())
    f1.close() #['想要他们的联系方式吗? ', ' 请加我微信。222222222'] #换行符都出来了,还有指标符



    for循环(永远只占一行内存):
    f1=open('log1',encoding='utf-8')
    for i in f1:
    print(i)
    f1.close()


    read(n):只针对于r模式,按照字符读取
    f1 = open('log1', encoding='utf-8')
    content = f1.read(6)  # r 模式 按照字符读取。
    print(content) #我是中国人
    f1.close()
    contenlist=[]
    for i in content:
    contenlist.append(i)
    print(contenlist) # ['我', '是', '中', '国', '人', ' ']


    f1=open('log1',mode='rb')
    content=f1.read(6)
    print(content)
    f1.close() #b'xe6x88x91xe6x98xaf' (十六进制)按照这种输出方式,有时可以看出编码格式,9个字节肯定是utf-8,6个字节不一定,有可能是utf-8,也有可能是gbk

    # f1 = open('log1', mode='rb')
    # content = f1.read(3) # rb模式 按照字节读取。
    # print(content.decode('utf-8'))
    # f1.close() #我

    #编码的补充:把gbk的bytes类型转换成utf-8的bytes类型,需要先转成unicode,再转成utf-8
    s1 = b'xd6xd0xb9xfa'
    s2 = s1.decode('gbk')
    s3 = s2.encode('utf-8')
    print(s3) # b'xe4xb8xadxe5x9bxbd'
    s1 = b'xd6xd0xb9xfa'.decode('gbk').encode('utf-8')
    print(s1)

    执行结果:

    b'xe4xb8xadxe5x9bxbd'
    b'xe4xb8xadxe5x9bxbd'

    r+读写:先读后写,写是在文件后追加。

    f1=open('log1',encoding='utf-8',mode='r+')
    print(f1.read()) #打印出了f1的内容
    f1.write('666')
    f1.close() #往f1种写入了666

    能不能先写再读呢?就需要seek调整光标,一般都是先读后写,很少有先写后读的
    光标 按照字节去运转 seek(数字、字符串、字母,一个字节表示一个,中文是3个字节)

    f1 = open('log1', encoding='utf-8', mode='r+')
    f1.seek(0,2) 光标调整到内容最后
    f1.write('6666')
    f1.seek(0)#调整光标 光标调整到内容头部
    print(f1.read())

    4、文件的写:

    w:1、没有文件,会创建文件,写入内容

          2、有文件,将原文件所有内容清空,写入新内容

    wb模式:1、bytes类型有好多种,带b的不用写编码方式

    f1=open('log2',encoding='utf-8',mode='w')
    f1.write('我是中国人,我爱五星红旗')
    f1.close() #会创建log2文件,并且写入内容

    f1=open('log2',encoding='utf-8',mode='w')
    f1.write('今天是个好日子')
    f1.close() #这个会把之前log2文件内容全部清空,然后重新写入


    w+写读模式:写读模式,先写后读,用的不多
    f1=open('log2',encoding='utf-8',mode='w+')
    print(f1.read()) #这个读出来为空,因为是有文件,文件内容先清空
    f1.write('666')
    f1.close() #内容为666

    a、ab(a在文件追加,ab是bytes模式)
    f1=open('log2',encoding='utf-8',mode='a')
    f1.write(' 老男孩')
    f1.close() #在之前文件内容的基础上换行,写入老男孩

    a+:写读模式
    f1 = open('log2', encoding='utf-8', mode='a+')
    f1.write('fdsafdsafdsagfdg')
    f1.seek(0)
    print(f1.read())
    f1.close()

    5、其他操作方法:
    #其他操作方法:
    read read(n) readline() readlines() write() close
    readable writable
    tell 告诉指针的位置
    f1 = open('log2', encoding='utf-8', mode='w')
    f1.write('fdsafdsafdsagfdg')
    print(f1.tell())
    f1.close()
    seek(参数),seek(0,2) 调至最后 按照字节去调整光标

    # tell 告诉指针的位置
    f1 = open('log2', encoding='utf-8', mode='w')
    f1.write('abc')
    print(f1.tell())
    f1.close() #3

    #with open() as:
    对f1文件读取,对f2文件写入,如果代码较长,加可以承接。with open() as这种方式不需要手动关闭。
    with open('log1',encoding='utf-8') as f1,
    open('log2',encoding='utf-8',mode='w') as f2:
    print(f1.read())
    f2.write('777')


    #文件的改:
    #文件的改
    #1,打开原文件,产生文件句柄。
    #2,创建新文件,产生文件句柄。
    #3,读取原文件,进行修改,写入新文件。
    #4,将原文件删除。
    #5,新文件重命名原文件。

    import os
    with open('file_test', encoding='utf-8') as f1,
    open('file_test.bak', encoding='utf-8', mode='w') as f2:
    old_content = f1.read()
    new_content = old_content.replace('alex','SB')
    f2.write(new_content)
    os.remove('file_test')
    os.rename('file_test.bak','file_test')

    把文件中每一行中的SB都改成alex
    import os
    with open('file_test', encoding='utf-8') as f1,
    open('file_test.bak', encoding='utf-8', mode='w') as f2:
    for line in f1:
    new_line = line.replace('SB','alex')
    f2.write(new_line)
    os.remove('file_test')
    os.rename('file_test.bak','file_test')
    执行结果:
    alexahahahh
    alex好好好好好
    alex123






  • 相关阅读:
    进程间通信之数据共享--共享内存
    进程间通信之分工协作-信号灯
    进程间通信之分工协作--锁
    进程间通信之事件通知--信号
    进程间通信之数据传输--Socket
    c++模板特化
    DAG模型:嵌套矩形
    数字三角形
    c柔性数组结构成员
    模板
  • 原文地址:https://www.cnblogs.com/lucky-penguin/p/8861504.html
Copyright © 2020-2023  润新知