ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python文件操作

2021-11-12 17:33:44  阅读:137  来源: 互联网

标签:文件 encoding Python utf8 模式 操作 txt open


Python文件操作

  • 文件操作方法
  • 文件操作模式
  • 简易版本的拷贝功能
  • 文本模式与二进制模式读写操作
  • 文件内光标的移动
  • 文件内容修改

一、文件操作方法

  1. 读系列

    read() 一次性读取文件内所有的内容

with open(r'a.txt', 'r', encoding='utf8') as f:
    print(f.read())  # 一次性读取文件内所有的内容

     readline() 每次只读文件一行内容

with open(r'a.txt', 'r', encoding='utf8') as f:
    print(f.readline())  # 每次只读文件一行内容

     readlines() 读取文件内所有内容,组织成列表,每个元素是文件的每行内容

with open(r'a.txt', 'r', encoding='utf8') as f:
    print(f.readlines())  # 读取文件所有的内容,组织成列表,每个元素是文件的每行内容

     readable() 判断当前文件是否可读

with open(r'a.txt', 'r', encoding='utf8') as f:
    print(f.readable())  # 判断当前文件是否具备读的能力

   2. 写系列

    write() 往文件中写入文件内容

with open(r'a.txt', 'w', encoding='utf8') as f:
    f.write('aaa\nbbb\nccc')  # 写入内容必须是字符串类型

    文件中就出现了写入的内容:

     writelines() 可以将列表中多个字符串元素全部写入

with open(r'a.txt', 'w', encoding='utf8') as f:
    f.writelines(['ddd', 'eee', 'fff'])  # 可以将列表中多个字符串元素全部写入

    文件中如图所示:

     writeable() 判断当前文件是否具备可写能力

with open(r'a.txt', 'w', encoding='utf8') as f:
    print(f.writable())  # 判断当前文件是否具备可写能力

     flush() 在Python中调用文件写方法时,紧接着调用flush()方法,可以将文件立即写入磁盘中

with open(r'a.txt', 'w', encoding='utf8') as f:
    f.write('aaa\nbbb\nccc')
    f.flush()  # 直接将内存内文件数据刷到硬盘 相当于ctrl+s

  3. 文件优化操作

with open(r'a.txt', 'r', encoding='utf8') as f:
    print(f.read())  # 一次性读取文件内所有的内容
    print(f.read())  # 一次性读取文件内所有的内容
    print(f.read())  # 一次性读取文件内所有的内容

     可以看出,这种方法去取文件存在一些问题:

      1) 一次性读取完之后,光标停留在了文件末尾,无法再抽读取内容

      2) 该方法在读取大文件的时候,可能会造成内存溢出的情况

     我们可以使用逐行读取文件内容的方式解决上述问题。

with open(r'a.txt', 'r', encoding='utf8') as f:
    for line in f:  # 文件变量名f支持for循环,相当于一行行读取文件内容
        print(line, end='')

    涉及到多行文件内容的情况一般都是采用for循环读取。

二、文件操作模式

  1. t  文本模式

    1) 文本模式是默认的模式,r只读、w只写和a只追加默认为  rt  wt  at

    2) 该模式所有操作都是以字符串为基本单位(文本)

    3) 该模式必须要指定encoding参数

    4) 该模式只能操作文本文件

  2. b  二进制模式

    1) 该模式需要指定,使用二进制模式用  rb  wb  ab

    2) 该模式所有操作都是以bytes类型(二进制)基本单位

    3) 该模式不需要指定encoding参数

    4) 该模式可以操作任意类型的文件

三、简易版本的拷贝内容

  1.功能

    1) 获取待拷贝的目标文件路径

    2) 获取即将拷贝到哪个地方的新路径

    3) 利用文件操作实现数据拷贝

  2. 实现

# 1.待拷贝的文件路径
wait_copy_file = input('待拷贝的文件路径:').strip()
# 2.新的文件路径
new_file_path = input('新路径:').strip()
# 3.以r模式打开步骤1的路径,以w模式打开步骤2的路径
with open(r'%s' % wait_copy_file, 'rb') as f1, \
        open(r'%s' % new_file_path, 'wb') as f2:
    for line in f1:
        f2.write(line)

a.txt中的内容:

 b.txt中的内容:

     拷贝成功!该程序使用的是二进制模式,支持拷贝其他格式的文件(如:jpg、mp4等)。

 四、文本模式与二进制模式读写操作

  1. read()  括号内可以放数字

    在t模式下表示字符个数

    在b模式下表示字节个数

      英文字符统一使用一个bytes来表示,中文字符统一使用三个bytes来表示

  2. 例子

with open(r'a.txt', 'rb') as f:
    print(f.read(6).decode('utf8'))

    结果输出两个中文字符:

with open(r'a.txt', 'r', encoding='utf8') as f:
    print(f.read(4))

    结果输出四个中文字符:

 五、文件内光标的移动

  1. seek()  控制文件内光标的移动

    f.seek(offset, whence)

    offset表示位移量

      1) 始终是以字节为最小单位

      2) 正数是从左往右移动

      3) 负数是从右往左移动

    whence表示模式

      1) 0:以文件开头为参考系(支持tb两种模式)

      2) 1:只支持b模式,以当前位置为参考系

      3) 2:只支持b模式,以文件末尾为参考系

  2. 小练习

    实现动态查看最新一条日志的效果

import time
with open('a.txt', 'rb') as f:
    f.seek(0, 2)
    while True:
        line = f.readline()
        if len(line) == 0:
            # 没有内容
            time.sleep(0.5)
        else:
            print(line.decode('utf-8'), end='')

六、文件内容修改

  1. 覆盖

with open(r'a.txt', 'r', encoding='utf8') as f:
    data = f.read()
with open(r'a.txt', 'w', encoding='utf8') as f1:
    new_data = data.replace('aaa', 'ccc')
    f1.write(new_data)

    修改前:

     修改后:

  2. 新建

import os

with open('a.txt', mode='rt', encoding='utf-8') as read_f, \
        open('a.txt.swap', mode='wt', encoding='utf-8') as write_f:
    for line in read_f:
        write_f.write(line.replace('ccc', 'fff'))
os.remove('a.txt')  # 删除原文件
os.rename('a.txt.swap', 'a.txt')  # 重命名文件

    修改前:

     修改后:

标签:文件,encoding,Python,utf8,模式,操作,txt,open
来源: https://www.cnblogs.com/balzac/p/15545672.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有