博客整理day09

Python day09

一 文件处理

  • 什么是文件

    操作系统提供的虚拟概念,存储信息(用二进制存储信息)

  • 操作文件的流程

    # 1. 打开文件
    # ①文件路径②打开模式,w-->write③
    # print('D:\上海python12期视频\python12期视频\day 09\test.py')
    # print('D:\上海python12期视频\python12期视频\day 09\\test.py') # \\t--》第一个\会让第二个\失去意义
    # print(r'D:\上海python12期视频\python12期视频\day 09\test.py') # r会让内部所有的\失效
    f = open(r'D:\上海python12期视频\python12期视频\day 09\test.py','w',encoding='utf8')
    
    # 2. 修改/读取文件
    f.write('''
    孩儿立志出湘关,学不成名誓不还
    埋骨何须桑之地,人生无处不青山
    ''')
    
    # 3. 保存文件
    f.flush()  # 快速保存,你可以不使用
    
    # 4. 关闭文件: python真的能操控文件?python通过操作系统操作文件
    # del f
    f.close()  # 告诉操作系统关闭文件
    

二 文件打开的三种模式

文件操作的基础模式有三种(默认的操作模式为r模式):

  • r模式为read
  • w模式为write
  • a模式为append

文件读写内容的格式有两种(默认的读写内容的模式为b模式):

  • t模式为text
  • b模式为bytes

需要注意的是:t、b这两种模式均不能单独使用,都需要与r/w/a之一连用。

r模式

#读取:rt  read_text 读文本内容 只读
f = open(r'D:\上海python12期视频\python12期视频\day 09\test.py', 'rt', encoding='utf8')
f.write('slkdjfklj')
data = f.read()
print(data)
print(f.readable()) # 判断是否可读
print(f.writable()) # 判断是否可写

data = f.read()  # 读取所有文本内容
print(data)

w模式

# wt: 只写(w清空文件后写入),不可读
f = open(r'D:\上海python12期视频\python12期视频\day 09\test.py', 'wt', encoding='utf8')
print(f.readable())
print(f.writable())

f.write('abc')

a模式

at: 只写入(追加写入)
f = open(r'D:\上海python12期视频\python12期视频\day 09\test.py', 'at', encoding='utf8')
print(f.readable())
print(f.writable())

f.write('中')

三 绝对和相对路径

  • 文件的路径: 文件在硬盘的地址

  • 绝对路径: 从盘符开始

  • 相对路径: 执行文件(当前运行的文件)的文件夹下的文件名,执行文件和打开文件属于同一文件夹下

四 with管理上下文

# with提供一个自动关闭文件(接触了操作系统的占用)
with open('test.py', 'r', encoding='utf8') as f:
    # print(f.read())
    # 在这个缩进下不会关闭文件,在这个缩进下对文件操作
    data = f.read()  # data放到python的内存中

print(data)
# 关闭文件(操作系统),没有关闭python内存中的文件
print(f)  # 只涉及python
# print(f.read())  # 涉及操作系统,报错

五 文件的高级应用

可读可写

#可写可读 r+
with open('test.py', 'r+', encoding='utf8') as fr:
    # print(fr.readable())
    # print(fr.writable())
    fr.write('高级')  # 光标在文件头部,覆盖后面的字符

#可写可读 w+ 和 w 没有任何区别
with open('test.py', 'w+', encoding='utf8') as fw:
    print(fw.readable())
    print(fw.writable())

#可写可读 a+ a模式默认光标在尾部
with open('test.py','a+',encoding='utf8') as fw:
    print(fw.readable())
    print(fw.writable())
    fw.seek(0,0)
    print(fw.read())

文件内指针移动

  1. seek(offset,whence): offset代表文件指针的偏移量,偏移量的单位是字节个数

    # seek()
    with open('36r.txt', 'rb') as fr:
        print(f"fr.seek(4, 0): {fr.seek(4, 0)}")  # 0相当于文件头开始;1相当于当前文件所在位置;2相当于文件末尾
        # fr.seek(0,2)  # 切换到文件末尾
    
  2. tell(): 每次统计都是从文件开头到当前指针所在位置

    # tell()
    with open('36r.txt', 'rb') as fr:
        fr.seek(4, 0)
        print(f"fr.tell(): {fr.tell()}")
    
  3. read(n): 只有在模式下的read(n),n代表的是字符个数,除此之外,其他但凡涉及文件指针的都是字节个数

    # read()
    with open('36r.txt', 'rt', encoding='utf-8') as fr:
        print(f"fr.read(3): {fr.read(3)}")
    
  4. truncate(n): truncate(n)是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate()要在r+或a或a+等模式下测试效果。它的参照物永远是文件头。并且truncate()不加参数,相当于清空文件。

    # truncate()
    with open('36r.txt', 'ab') as fr:
        fr.truncate(2) # 截断2个字节后的所有字符,如果3个字节一个字符,只能截断2/3个字符,还会遗留1/3个字符,会造成乱码
    

六 文件修改的两种方式

方法一

​ 将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)。

import os

with open('37r.txt') as fr, \
     open('37r_swap.txt', 'w') as fw:
 data = fr.read()  # 全部读入内存,如果文件很大,会很卡
 data = data.replace('tank', 'tankSB')  # 在内存中完成修改

 fw.write(data)  # 新文件一次性写入原文件内容

# 删除原文件
os.remove('37r.txt')
# 重命名新文件名为原文件名
os.rename('37r_swap.txt', '37r.txt')
print('done...')

方法二

​ 将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件。

import os

with open('37r.txt') as fr,\
     open('37r_swap.txt', 'w') as fw:
 # 循环读取文件内容,逐行修改
 for line in fr:
     line = line.replace('jason', 'jasonSB')
     # 新文件写入原文件修改后内容
     fw.write(line)

os.remove('37r.txt')
os.rename('37r_swap.txt', '37r.txt')
print('done...')
posted @ 2019-09-18 18:35  simple123  阅读(293)  评论(0编辑  收藏  举报