• 文件操作


    在电脑上打开文件的操作:

      1.打开文件

      2.读取,修改等操作文件

      3.关闭文件

    对文件操作流程

    1. 打开文件,得到文件句柄并赋值给一个变量
    2. 通过句柄对文件进行操作
    3. 关闭文件 

    打开文件的语法:

      open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

    file为文件相对路径或名称,mode为读取操作的模式(见下文),encoding是对字符编码的操作设置。

      在window上环境下打开文档,使用的操作系统的默认字符编码,windows操作系统的默认字符编码是GBK,因此需要对在open()的时候指定encoding='utf-8'。

    1 data=open('yesterday',encoding='utf-8').read()
    2 print(data)
    3 #一次性输出文件的所有内容

       想要在打开文件后对文件进行更多的操作,需要将打开的文件内存对象赋一个变量。然后,再通过找到该文件对象,对文件进行操作。

      一般情况下,文件名的对象取名为'f'.

    1 f = open('yesterday',encoding='utf-8') #文件句柄——就是这个文件的内存对象。文件句柄内包含该文件的文件名,字符集,大小,在内存上的起始位。
    2 data =f.read()
    3 data2=f.read()
    4 print(data)
    5 print('DATA2'.center(50,'-'),data2)

    返回的是第一遍的文件输出,以及格式化的”DATA2“。

    print('DATA2'.center(50,'-'),data2) 并未重新返回文件内容。

    原因在于:文件中有文件指针(相当于文档中的光标,它是按字符位向后移动)

    文件最初打开开始,从第一行开始读取文件内容,读完以后,不会重头开始,文件的读取指针还是停留在末尾。

    如果需要重新阅读该文件,将文件指针移回相应的位置即可(如头)。

    打开文件,想要对文件进行各种操作,需要指定打开文件的模式,即设置mode.

    下面介绍所有的模式:

      打开文件的模式有:

    • r,只读模式(默认)。 __read
    • w,只写模式。【不可读;不存在则创建;存在则删除内容;】——注意:不要随便使用该模式,如果不熟悉,请使用备份文件!!!!___write
    • a,追加模式。【不可读; 不存在则创建;存在则只追加内容;】___append

      "+" 表示可以同时读写某个文件

    • r+,读 写。【可读;可写;可追加】r+意味着 'r'+'a'=='r+'
    • w+,写 读。 创建一个新文件,可写可读,但是写只能按照执行顺序指定,无法通过光标的在定位插入。
    • a+,追加写 读。

    "U"表示在读取时,可以将 自动转换成 (与 r 或 r+ 模式同使用)  #用U将换行符统一为 。

    • rU  
    • r+U

    "b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

    • rb  以二进制格式读取文件。注意不能传encoding参数。用rb读取模式读取数据的应用场景:网络传输socket,
    • wb 以二进制格式写文件。只能写入bytes。
    • ab 以二进制格式追加写文件。
    1 f=open('lyrics.txt','rb')
    2 print(f.readline())
    3 f.close()
    4 f=open('lyrics.txt','wb')
    5 f.write('this is a string'.encode())
    6 f.close()

    关于打开的读取方式:

    f.read()是将所有的行都读到内存中去,f.readline()是一行一行的读取。

     1 #打印前5行
     2 f=open('lyrics.txt','r',encoding='utf-8')
     3 '''方法1:
     4 print(f.readline())
     5 print(f.readline())
     6 print(f.readline())
     7 print(f.readline())
     8 print(f.readline())
     9 '''
    10 
    11 #方法2:
    12 for i in range(5):
    13     print(f.readline())

     而f.readlines()返回的是一个包含所有行的列表:

    1 f=open('lyrics.txt','r',encoding='utf-8')
    2 print(f.readlines())
    3 [out]:['Somehow, it seems the love I knew was always the most destructive kind
    ', '不知为何,我经历的爱情总是最具毁灭性的的那种
    ', 'Yesterday when I was young
    ', '昨日当我年少轻狂
    ', ... 'The time has come for me to pay for yesterday
    ', '终于到了付出代价的时间 为了昨日
    ', 'When I was young
    ', '当我年少轻狂']

    由于f.readlines()是先把所有的行加载到内存中,存入到对象中作为一个列表再进行操作。由于从硬盘读取速度远远低于内存读取速度,因此,f.readlines()仅支持小文件操作。

    适合大文件操作的读取方式,是一行一行地读取到内存中,操作(动作)完成后就在内存中删除该行,保持内存中永远不会堆积文件。

    1 count=0  #计数器
    2 for line in f: #最佳读取方式,打印只保存一行。f是迭代器
    3     if count==9:
    4         print('我是分割线'.center(100,'-'))
    5         count += 1
    6         continue
    7     print(line)
    8     count+=1

    文件光标 f.tell():

    1 f=open('lyrics.txt','r',encoding='utf-8')
    2 print(f.tell())  #打印光标所处位置
    3 print(f.readline().strip())
    4 print(f.tell())  #打印当前光标所处位置,上面读取了一行的,故光标固定在了第一行的末尾,即“kind
    ”之后。
    5 f.close()

    返回:

     如果只想读取5个字符数,则:

    1 f=open('lyrics.txt','r',encoding='utf-8')
    2 print(f.tell())
    3 print(f.read(5))
    4 print(f.tell())
    5 f.close()

    返回:

    f.seek()是重新指定光标位置的函数:

    1 f=open('lyrics.txt','r',encoding='utf-8')
    2 print(f.tell())
    3 print(f.readline())
    4 print(f.readline())
    5 print(f.tell())
    6 f.seek(0)  #重新定位光标到位置0
    7 print(f.readline())
    8 print(f.tell())
    9 f.close()

    返回:

     

    f.encoding() 打印文件的编码

    1 f=open('lyrics.txt','r',encoding='utf-8')
    2 print(f.encoding)
    3 f.close()

    返回:

    f.fileno()  返回整数的底层实现使用请求从操作系统的I / O操作的文件描述符。

    1 f=open('lyrics.txt','r',encoding='utf-8')
    2 print(f.fileno())  #返回整数的底层实现使用请求从操作系统的I / O操作的文件描述符。
    3 ##操作系统会有专门的接口去调度所有文件,返回的是在内存中的编号。
    4 f.close()

    返回:

     f.isatty() 判断读取的文件是否为tty(终端设备)

    打印机,linux下的terminal等都属于终端设备。

    1 f=open('lyrics.txt','r',encoding='utf-8')
    2 print(f.isatty())  #判断读取的该文件是否为tty(终端设备)
    3 f.close()

    在tty文件上无法移动光标,f.seekable()用来判断文件是否可以进行光标的定位。

    f.readable()  判断文件是否可读;

    f.writable() 判断文件是否可写。

    f.flush()  强制刷新

    文件读写有一个缓存的机制,一般情况下是内存中的数据大小达到限定的大小,会写入硬盘中;如果操作没有成功从内存中写入到硬盘中,可以使用f.flush()进行强制刷新。

    创建一个flush_test.txt文件后,打开改文件,发现里面并没有写入任何数据。

    用f.flush()进行强制刷新以后,重新打开文件发现已经成功写入到文件中。

    f.buffer 是内存中的一个临时文件,

    f.truncate() 截断

     1 f=open('test','a',encoding='utf-8')
     2 
     3 help(f.truncate)
     4 Help on built-in function truncate:
     5 
     6 truncate(pos=None, /) method of _io.TextIOWrapper instance
     7     Truncate file to size bytes.    
     8     File pointer is left unchanged.  Size defaults to the current IO
     9     position as reported by tell().  Returns the new size.
    10 '''这种方法截断文件的大小。如果可选的大小参数是存在的,该文件被截断(最多)大小.
    11 大小默认到当前位置。当前文件的位置没有改变。请注意,如果指定的大小超过了当前文件的大小,结果是依赖于平台.
    12 此方法不返回任何值。
    13 注意:此方法不会在当文件工作在只读模式打开。'''
    14 
    15 f=open('lyrics.txt','a',encoding='utf-8')
    16 f.truncate(10)
    17 f.close()
    18 #文件中阶段留下了从首字符开始的10个字符。

    修改文件的方法:

    在硬盘中修改文件数据就是对文件数据进行覆盖(受限于硬盘的存储原理),但是在内存中修改可以进行插入,调整,不会覆盖原文件。

    所以对文件进行修改,

      第一种:需要将文件从硬盘中加载到内存中进行修改(只适用于小文件修改);

      第二种:打开一个文件,修改完了写入到一个新文件中。

    1 f=open('lyrics.txt','r',encoding='utf-8')  #读写
    2 f_new=open('lyrics_new','w+',encoding='utf-8')
    3 for line in f:
    4     if '肆意的快乐等我享受' in line:
    5         line=line.replace('肆意的快乐等我享受','肆意的快乐等Zoe享受')
    6     f_new.write(line)
    7 f.close()
    8 f_new.close()

    with语句

    为了避免打开文件后忘记关闭,可以通过with语句管理上下文,即:

    with open('lyrics.txt','r',encoding='utf-8') as f:
    print(f.readline())

    当with代码块执行完毕时,内部会自动关闭并释放文件资源。

    在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:

    1 with open('lyrics.txt','r',encoding='utf-8') as f,open('lyrics_new','r',encoding='utf-8') as f_new:
    2     print(f.readline())
    3     print(f_new.readline())

     Python官方文档建议一行代码不要超过80个字符,所以这种较长的代码可以写成:

    1 with open('lyrics.txt','r',encoding='utf-8') as f,
    2         open('lyrics_new','r',encoding='utf-8') as f_new:
  • 相关阅读:
    Git使用教程
    H5项目常见问题汇总及解决方案
    globalAlpha 示例
    canvas 绘制三次贝塞尔曲线
    canvas 绘制二次贝塞尔曲线
    html5 图片360旋转
    HTML5 arc的例子
    HTML5 绘制阴影
    HTML5 canvas绘制文本
    html5 lineTo的使用例子
  • 原文地址:https://www.cnblogs.com/zoe233/p/7049256.html
Copyright © 2020-2023  润新知