zoukankan      html  css  js  c++  java
  • python之文件操作

    一、文件操作

    一、文件操作

    1、文件操作基本步骤

    1 #文件操作基本流程
    2 #1、打开文件,得到文件句柄并赋值给一个变量
    3 #2、通过句柄对文件进行操作
    4 #3、关闭文件
    5 
    6 f = open('test1',encoding='utf-8')
    7 data = f.read()
    8 print(data)
    9 f.close()

    备注:

    (1)、打开文件的时候写的相对路径:应为在同一文件级别中;

    (2)、在打开文件没有指定编码格式,就会报错;

    原因分析:a、保存文件到硬盘上时,是将字符保存到硬盘上为二进制,字符到二进制中间有编码格式:utf-8,gbk,unicode等编码格式;

         b、经过查看文件test1的编码格式:直接在pycharm中打开test1文件,编码格式为utf-8格式,在pycharm右下角可以查看文件的编码格式;

            c、pycharm默认的编码格式就是utf-8,那为什么还会报错“gbk不能解码呢”?因为在打开文件文件的时候,默认oper命令读取的是操作系统的编码格式,即我现在的电脑是win10,编码格式为GBK,所以出现这种报错

         d、在下面代码中,还有一个问题:就是在文件操作完成后,没有关闭文件,释放硬件资源:f.close()

    1 f = open('test1')
    2 data = f.read()
    3 print(data)
    4 #打印消息:
    5 UnicodeDecodeError: 'gbk' codec can't decode byte 0x82 in position 80: illegal multibyte sequence

    2、文件打开方式:文件打开的时候对文件的操作方式

    (1)、r:只读;

    1 f =  open('陈粒',encoding = 'utf-8')
    2 data = f.read()
    3 print(data)
    4 f.close()
    5 #如果没有写文件打开方式默认为读:r

    a、readable:判断是否可读

    1 f =  open('陈粒','r',encoding = 'utf-8')
    2 data = f.read()  #将文件所有内容都读取出来
    3 print(data)
    4 print(f.readable())  #True
    5 print(f.writable())  #False
    6 f.close()

    b、readline

     1 f =  open('陈粒','r',encoding = 'utf-8')
     2 for i in range(1,6):
     3     print( '这是第%d行:' %i,f.readline())
     4     i =i+1
     5 """ Q1、这是打印结果:为什么在第5行打印结果为空?
     6 这是第1行: f =  open('陈粒',encoding = 'utf-8')
     7 
     8 这是第2行: data = f.read()
     9 
    10 这是第3行: print(data)
    11 
    12 这是第4行: f.close()
    13 
    14 这是第5行: 
    15 """
    16 #因为我陈粒这个文件总共只有4行字符,当读取到第4行的时候,游标已经到文件
    17 #末尾,再读取第5行的时候,就读取的是空值
    18 #Q2、为什么打印结果有换了行的?
    19 #
    View Code

    c、readlines

    1 f =  open('陈粒',encoding = 'utf-8')
    2 print(f.readlines())
    3 #["f =  open('陈粒',encoding = 'utf-8')
    ", 'data = f.read()
    ', 'print(data)
    ', 'f.close()
    ']

    (2)、w:只写;

    如果文件存在,直接清空文件,然后在写;如果文件不存在,新建文件

    1 f = open('陈粒','w',encoding='utf-8')
    2 f.write('11111')
    3 f.write('22222')
    4 f.write('11111
    ')
    5 f.write('2222
    ')
    6 f.write('11111
    2222
    ')
    7 print(f.writable())
    8 f.writelines(['2222
    ','12222345
    '])   #文件只能写入字符串

    (3)、a:只追加;

    1 f = open('陈粒','a',encoding='utf-8')
    2 print(f.readable()) #f.read()
    3 f.write('追加的一行')
    4 f.close()
    5 e = open('陈粒','r',encoding='utf-8')
    6 print(e.read())

    (4)、其他模式

    a、文件修改:文件其实没有修改的说法,都是覆盖文件

    将文件从硬盘上读到内存中,然后在内存中修改,然后将内存中修改的二进制覆盖到到源文件中

     1 src_f = open('陈粒','r',encoding ='utf-8')
     2 data = src_f.readlines() #将读取到的内容赋值为data变量
     3 for i in data:
     4     hs= 1
     5     print( '数据类型为:'+str(type(i)),i,end='')
     6     # print(type(i))
     7 src_f.close()
     8 # 然后将s
     9 dst_f = open('陈粒1','w',encoding='utf-8')
    10 dst_f.writelines(data) #在dst_f句柄中将内存中的变量data的值写入到文件陈粒1中
    11 dst_f.close()

    b、with    as方式可以实现软件自动关闭打开的文件

     1 with open('test','w') as f:
     2     f.write('11111
    ')
     3 with open('test','a') as e:
     4     e.writelines(['Who is that
    ','This is zhangsan
    '])
     5 with open('test','r') as src_f,
     6         open('test1','w') as dst_f:
     7     #['11111
    ', 'Who is that
    ', 'This is zhangsan
    '] <class 'list'>
     8     data = src_f.readlines()
     9     print(data,type(data))
    10     dst_f.writelines(data[1:3]) #Who is that   This is zhangsan

    c、r+:可读可写

     1 f = open('test1','r+',encoding ='utf-8')
     2 pd_read = f.readable()
     3 pd_write = f.writable()
     4 print(pd_write,pd_read)
     5 if pd_write is True:
     6     f.writelines(['My name is zhangsan', 'I like chichen'])
     7 if pd_read is True:
     8     data = f.readlines()
     9     e = open('test2','w',encoding = 'utf-8')
    10     e.writelines(data)

    d、w+:可读可写

    e、a+:可读可写

    3、第二种文件处理方式:b模式

    备注:为什么要用b模式处理文件:

    文件不只是只有文本模式‘’,

    可以跨平台

    b模式对于linux没有用,因为linux系统默认的就是b模式

    (1)、rb:以字节的方式读取文件

     1 # f = open('txt','rb',encoding='utf-8')
     2 # #ValueError: binary mode doesn't take an encoding argument
     3 #字节模式不需要写编码方式
     4 # data= f.read()
     5 # print(data)
     6 zhuijia = open('test2','a',encoding='utf-8')
     7 zhuijia.writelines(['我叫张三','来自重庆'])
     8 zhuijia.close()
     9 f = open('test2','rb')
    10 data = f.read()
    11 #b'Who is that
    This is zhangsan
    My name is zhangsanI like chichen
    12 # xe6x88x91xe5x8fxabxe5xbcxa0xe4xb8x89xe6x9dxa5xe8x87xaaxe9x87x8dxe5xbax86'
    13 #X表示16进制
    14 #在windows平台中国,回车符是
    ;linux/unix平台中回车是/n
    15 #我的电脑操作系统为win10,所以以字节方式打开时,打印的结果为
    
    16 print(data)
    17 #使用utf-8进行解码结果:My name is zhangsanI like chichen我叫张三来自重庆我叫张三来自重庆
    18 print(data.decode('utf-8'))

    (2)、wb模式

    1 f = open('test3','wb')
    2 #TypeError: a bytes-like object is required, not 'str'
    3 # f.write('11111
    ')
    4 f.write(bytes('11111
    ',encoding = 'utf-8'))
    5 f.write('张三'.encode('utf-8'))

    (3)、ab模式

    f = open('test3','ab')
    #TypeError: a bytes-like object is required, not 'str'
    # f.write('11111
    ')
    f.write(bytes('11111
    ',encoding = 'utf-8'))
    f.write('张三'.encode('utf-8'))

    4、文件操作的其他方法

    1 f = open('a.txt','r',encoding='utf-8')
    2 # print(f.closed) #False
    3 print(f.encoding)   #utf-8打印文件的打开的编码方式
    4 #在不知道文件编码格式的时候可以采用latin-1格式,可以最大限度读取数据
    5 f.flush() #刷新
    6 f.name #文件名
    7 print(f.tell()) #光标所在位置
    8 f.readline()
    9 print(f.tell())

     5、文件内光标的移动

    a、文件打开方式为文本模式时,代表读取三个字符;

    b、文件打开方式为b模式时,代表读取三个字节;

    c、其余的文件内光标移动都是以字节为单位如:seek、tell、truncate

    d、seek有三种移动方式:0/1/2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的。

    f = open("text_1","rb",encoding="utf-8") ##seek必须要以b的模式
    f.seek(3,0) #0模式表示从文件的开始
    print(f.tell()) ###3
    f.seek(3,1) #1模式表示从上次光标停留的位置开始
    f.seek(-3,2)    ##2模式表示从文件末尾进行seek
    

      

    e、truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a+等模式下测试效果

    备注:newline=‘’的用法:读取文件中真实的换行符号

    1 # f = open('a.txt','r',encoding='utf-8',newline='' )
    2 # print(f.readlines())  ##['你好
    ', '11233
    ', '4497798']
    3 f = open('a.txt','r',encoding='utf-8')
    4 print(f.readlines())##['你好
    ', '11233
    ', '4497798']
    5 #在Python中同一将回车符转换为
    
  • 相关阅读:
    正则表达式
    特殊符号作用
    sed
    scp
    EOF
    env
    JAVA进阶5
    JAVA进阶4
    JAVA进阶3
    JAVA进阶2
  • 原文地址:https://www.cnblogs.com/tengjiang/p/9251562.html
Copyright © 2011-2022 走看看