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

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

      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:
  • 相关阅读:
    winform+c#之窗体之间的传值 Virus
    ASP.NET 2.0 利用 checkbox获得选中行的行号, 在footer中显示 Virus
    .NET中的winform的listview控件 Virus
    我的书橱
    Expert .NET 2.0 IL Assembler·译者序一 写在一稿完成之即
    Verbal Description of Custom Attribute Value
    AddressOfCallBacks in TLS
    下一阶段Schedule
    2008 Oct MVP OpenDay 第二天 博客园聚会
    2008 Oct MVP OpenDay 第二天 颁奖·讲座·晚会
  • 原文地址:https://www.cnblogs.com/zoe233/p/7049256.html
Copyright © 2011-2022 走看看