파이썬 파일 처리를 얻기

a의 소개

하드 디스크에 저장해야합니다 영구적으로 저장하려면이 응용 프로그램은, 최초의 메모리에 저장되어 생성 된 데이터에서 실행됩니다. 운영 체제를 통과해야 하드웨어를 작동하는 응용 프로그램을 원하는 파일을 가상 하드 디스크의 개념을 작동 할 수있는 응용 프로그램에 운영 체제 인 경우, 사용자 또는 응용 프로그램 파일 작업은 운영 체제에 대한 호출을 시작하고 운영 체제에서 하드 디스크를 완료 특정 작업.

이 파일 작업의 기본 흐름

2.1 기본 프로세스

파일의 개념으로, 우리는 단지 파일 작업의 과정에 초점을 맞출 필요가 하드 드라이브의 작동에 대한 자세한을 고려 갈 필요가 없습니다 :

# 1. 打开文件,由应用程序向操作系统发起系统调用open(...),操作系统打开该文件,对应一块硬盘空间,并返回一个文件对象赋值给一个变量f
f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r
 
# 2. 调用文件对象下的读/写方法,会被操作系统转换为读/写硬盘的操作
data=f.read()
 
# 3. 向操作系统发起关闭文件的请求,回收系统资源
f.close()

2.2 재활용 및 상황 관리를

열려있는 파일 (F) 응용 프로그램 및 운영 체제 변수 : 열고 리소스 파일은 두 부분으로 포함되어 있습니다. 파일 작업이 완료되면, 그것은 완전히 회복되어야하며, 리소스 파일의 두 부분은 복구 프로세스는 다음과 같습니다

1、f.close() #回收操作系统打开的文件资源
2、del f #回收应用程序级的变量

어느 del f발생해야 f.close(), 이후 그렇지 않으면 파일을 열 수있는 운영 체제의 원인이됩니다 헛되이 풋 프린트, 닫을 수 없습니다,
자동 쓰레기 수집 메커니즘 파이썬은 우리가 고려할 필요가 있다고 판단 del f, 쓰기에 확인 작업이 완료되면 파일에 우리를 필요로하는, 라이브 f.close(), 우리가 강조하고 있지만, 그러나 대부분의 독자는 여전히 도움을 잊지 않을 것이다 f.close()염두에두고, 파이썬은 제공 with우리는 상황을 관리하는 데 도움이 키를

# 1、在执行完子代码块后,with 会自动执行f.close()
with open('a.txt', mode='w', coding='utf-8') as f:
    pass
 
# 2、可用用with同时定义读和写,用逗号分隔开即可
with open(r'test.txt', mode='r', encoding='utf-8') as rf,\
        open(r'test.txt', mode='r', encoding='utf-8') as rw:
        print(rf.read())  # 打印出全部读取到的内容

2.3 텍스트 파일의 문자 인코딩을 지정 조작

f = open(...)是由操作系统打开文件,如果打开的是文本文件,会涉及到字符编码问题,如果没有为open指定编码,那么打开文本文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。
这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。
 
f = open('a.txt','r',encoding='utf-8')

모델에게 세 개의 파일을 작동

3.1 파일의 제어 모드는 읽기 및 쓰기 작업

r(默认的):只读
w:只写
a:只追加写

3.1.1 사례 I : 사용 R 모드

# r只读模式: 在文件不存在时,则会报错;文件存在时,文件内指针直接跳到文件开头
with open('a.txt',mode='r',encoding='utf-8') as f:
     res=f.read() # 会将文件的内容由硬盘全部读入内存,赋值给res
 
# 小练习:实现用户认证功能
inp_name=input('请输入你的名字: ').strip()
inp_pwd=input('请输入你的密码: ').strip()
with open(r'db.txt',mode='r',encoding='utf-8') as f:
     for line in f:
         # 把用户输入的名字与密码与读出内容做比对
         u,p=line.strip('\n').split(':')
         if inp_name == u and inp_pwd == p:
             print('登录成功')
             break
     else:
         print('账号名或者密码错误')
 
# db.txt ------> kody:123

3.1.2 사례 2 : w 모드

# w只写模式: 在文件不存在时会创建空文档,文件存在会清空文件,文件指针跑到文件开头
with open('b.txt',mode='w',encoding='utf-8') as f:
    f.write('你好\n')
    f.write('我好\n')
    f.write('大家好\n')
    f.write('111\n222\n333\n')
#强调:
# 1 在文件不关闭的情况下,连续的写入,后写的内容一定跟在前写内容的后面
# 2 如果重新以w模式打开文件,则会清空文件内容

3.1.3 사례 3 : 패턴

# a只追加写模式: 在文件不存在时会创建空文档,文件存在会将文件指针直接移动到文件末尾追加新数据
with open('c.txt',mode='a',encoding='utf-8') as f:
     f.write('44444\n')
     f.write('55555\n')
#强调 w 模式与 a 模式的异同:
# 1 相同点:在打开的文件不关闭的情况下,连续的写入,新写的内容总会跟在前写的内容之后
# 2 不同点:以 a 模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后
 
# 小练习:实现注册功能:
name=input('username>>>: ').strip()
pwd=input('password>>>: ').strip()
with open('db1.txt',mode='a',encoding='utf-8') as f:
     info='%s:%s\n' %(name,pwd)
     f.write(info)

3.1.4 케이스 네 : + 모드가 사용됩니다 (알고)

# r+ w+ a+ :可读可写
#在平时工作中,我们只单纯使用r/w/a,要么只读,要么只写,一般不用可读可写的模式

및 쓰기 모드를 읽을 수있는 3.2 콘텐츠 컨트롤 파일

# 大前提: tb模式均不能单独使用,必须与r/w/a之一结合使用
# t(默认的):文本模式
    1. 读写文件都是以字符串为单位的
    2. 只能针对文本文件
    3. 必须指定encoding参数
# b:二进制模式:
   1.读写文件都是以bytes/二进制为单位的
   2. 可以针对所有文件,针对非文本文件(如图片、视频、音频等)
   3. 一定不能指定encoding参数

3.2.1 사례 I : t의 사용 패턴

# t 模式:如果我们指定的文件打开模式为r/w/a,其实默认就是rt/wt/at
with open('a.txt',mode='rt',encoding='utf-8') as f:
     res=f.read()
     print(type(res)) # 输出结果为:<class 'str'>
 
with open('a.txt',mode='wt',encoding='utf-8') as f:
     s='abc'
     f.write(s) # 写入的也必须是字符串类型
 
#强调:t 模式只能用于操作文本文件,无论读写,都应该以字符串为单位,而存取硬盘本质都是二进制的形式,当指定 t 模式时,python解释器内部帮我们做了编码与解码

3.2.2 사례 2 : B 모드

# b: 读写都是以二进制位单位
with open('1.mp4',mode='rb') as f:
     data=f.read()
     print(type(data)) # 输出结果为:<class 'bytes'>
 
with open('a.txt',mode='wb') as f:
     msg="你好"
     res=msg.encode('utf-8') # res为bytes类型
     f.write(res) # 在b模式下写入文件的只能是bytes类型
 
#强调:b模式对比t模式
1、在操作纯文本文件方面t模式帮我们省去了编码与解码的环节,b模式则需要手动编码与解码,所以此时t模式更为方便
2、针对非文本文件(如图片、视频、音频等)只能使用b模式
 
# 小练习: 编写拷贝工具
with open(r'冬季.png', 'rb') as rb, \
        open(r'冬季.jpg', 'wb') as wb:
    jpg = rb.read()
    wb.write(jpg)

방법 IV는 파일을 조작

4.1 키

# 读操作
f.read()  # 读取所有内容,执行完该操作后,文件指针会移动到文件末尾
f.readline()  # 读取一行内容,光标移动到第二行首部
f.readlines()  # 读取每一行内容,存放于列表中
 
# 强调:
# f.read()与f.readlines()都是将内容一次性读入内容,如果内容过大会导致内存溢出,若还想将内容全读入内存,则必须分多次读入,有两种实现方式:
# 方式一
with open('a.txt',mode='rt',encoding='utf-8') as f:
    for line in f:
        print(line) # 同一时刻只读入一行内容到内存中
 
# 方式二
with open('1.mp4',mode='rb') as f:
    while True:
        data=f.read(1024) # 同一时刻只读入1024个Bytes到内存中
        if len(data) == 0:
            break
        print(data)
 
# 写操作
f.write  # 写文件
f.writeable  # 是否可写
f.writelines()  # for + f.write() 循环写入多条
 
 
f.write('1111\n222\n')  # 针对文本模式的写,需要自己写换行符
f.write('1111\n222\n'.encode('utf-8'))  # 针对b模式的写,需要自己写换行符
f.writelines(['333\n','444\n'])  # 文件模式
f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式

4.2 알아보기

f.readable()  # 文件是否可读
f.writable()  # 文件是否可读
f.closed  # 文件是否关闭
f.encoding  # 如果文件打开模式为b,则没有该属性
f.flush()  # 立刻将文件内容从内存刷到硬盘
f.name

다섯 활성화 포인터 이동 제어 파일

#大前提:文件内指针的移动都是Bytes为单位的,唯一例外的是t模式下的read(n),n以字符为单位
f.seek(offset,whence)
offset: 相对偏移度 (光标移动的位数)针对的是字节
whence:指定光标位置从何开始
    0:从文件开头
    1:从当前位置
    2:从文件末尾
 
补充:
    utf-8:
        中文是3个bytes
        英文是1个bytes
    gbk:
        全部都是2个bytes
 
    open函数不设置encoding,默认是gbk
    与encode一毛钱都没有,encoding只是一个参数
 
    除了read里面的参数是针对字符,其他都是针对字节

5.1 사례 I : 0 모드 상세

# a.txt用utf-8编码,内容如下(abc各占1个字节,中文“你好”各占3个字节)
abc你好
 
# 0模式的使用
with open('a.txt',mode='rt',encoding='utf-8') as f:
    f.seek(3,0)     # 参照文件开头移动了3个字节
    print(f.tell()) # 查看当前文件指针距离文件开头的位置,输出结果为3
    print(f.read()) # 从第3个字节的位置读到文件末尾,输出结果为:你好
    # 注意:由于在t模式下,会将读取的内容自动解码,所以必须保证读取的内容是一个完整中文数据,否则解码失败
 
with open('a.txt',mode='rb') as f:
    f.seek(6,0)
    print(f.read().decode('utf-8')) #输出结果为: 好

5.2 사례 II : 1 개 모드는 상세

# 1模式的使用
with open('a.txt',mode='rb') as f:
    f.seek(3,1) # 从当前位置往后移动3个字节,而此时的当前位置就是文件开头
    print(f.tell()) # 输出结果为:3
    f.seek(4,1)     # 从当前位置往后移动4个字节,而此时的当前位置为3
    print(f.tell()) # 输出结果为:7

5.3 케이스 3 : 2 모드 상세

# a.txt用utf-8编码,内容如下(abc各占1个字节,中文“你好”各占3个字节)
abc你好
 
# 2模式的使用
with open('a.txt',mode='rb') as f:
    f.seek(0,2)     # 参照文件末尾移动0个字节, 即直接跳到文件末尾
    print(f.tell()) # 输出结果为:9
    f.seek(-3,2)     # 参照文件末尾往前移动了3个字节
    print(f.read().decode('utf-8')) # 输出结果为:好
 
# 小练习:实现动态查看最新一条日志的效果
import time
with open('access.log',mode='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='')

5.4 실험 질문 : 실시간 동적 변경 파일 가져 오기

파일에 기록 스크립트 :

# encoding:utf-8
import time
 
 
res = time.strftime('%Y-%m-%d %H:%M:%S')
print(res)
 
with open('a.txt', 'a', encoding='utf-8') as af:
    af.write(f'获取时间为:{res}\n')

실시간 동적 파일을 가져 오기 :

# encoding:utf-8
 
 
import time
 
with open(r'a.txt', 'r', encoding='utf-8') as rf:
    while True:
        res = rf.readline()  # 一次读取一行
        if res:
            print(f'捕捉新增记录:{res}')

여섯 개 파일을 수정

# 文件a.txt内容如下
张一蛋     山东    179    49    12344234523
李二蛋     河北    163    57    13913453521
王全蛋     山西    153    62    18651433422
 
# 执行操作
with open('a.txt',mode='r+t',encoding='utf-8') as f:
    f.seek(9)
    f.write('<妇女主任>')
 
# 文件修改后的内容如下
张一蛋<妇女主任> 179    49    12344234523
李二蛋     河北    163    57    13913453521
王全蛋     山西    153    62    18651433422
 
# 强调:
# 1、硬盘空间是无法修改的,硬盘中数据的更新都是用新内容覆盖旧内容
# 2、内存中的数据是可以修改的

하드 드라이브 공간에 파일 대응은, 하드 디스크, 수정할 수 없습니다 파일의 본질에 해당하는 수정할 수 없습니다
우리는 파일의 내용을 수정할 수 있습니다 참조, 그것을 달성하는 방법은?
일반 아이디어는 메모리에 다음, 메모리로 하드 디스크의 내용을 문서화하는 것입니다 수정이 완료된 후, 경질 피복되어
두 가지로 구분된다 구체적인 구현 :

6.1 방법 A는 파일을 수정

# 实现思路:将文件内容一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件
# 优点: 在文件修改过程中同一份数据只有一份
# 缺点: 会过多地占用内存
with open('a.txt', 'r+', encoding='utf-8') as r_f:
    data = r_f.read()
 
with open('a.txt', 'w+', encoding='utf-8') as w_f:
    w_f.write(data.replace('张一蛋', '张一蛋<妇女主任>'))
 
 
张一蛋<妇女主任>     山东    179    49    12344234523
李二蛋     河北    163    57    13913453521
王全蛋     山西    153    62    18651433422

6.1 파일 수정 두 번째 방법

# 实现思路:以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名
# 优点: 不会占用过多的内存
# 缺点: 在文件修改过程中同一份数据存了两份
import os
 
with open(r'a.txt', mode='rt', encoding='utf-8') as rf,\
    open(r'b.txt', mode='wt', encoding='utf-8') as wf:
    for line in rf:
        wf.write(line.replace('张一蛋', '张一蛋<妇女主任>'))
 
os.remove('a.txt')
os.rename('b.txt', 'a.txt')

추천

출처www.cnblogs.com/cnhyk/p/11822764.html