Python文件基本操作

mac2022-07-05  36

Python文件基本操作详注

Python文件操作1.以指定的方式, 打开文件:open报错2.以指定方式,读取文件:read readline等read函数按行读取遍历文件指针对象:最简单的按照行读取的方法 3.以指定方式,写入文件:write/writelines4.tell函数返回当前文件指针在文件中的位置5.seek函数定位文件指针6.flush函数立即写入文件7.关闭文件的规范操作with语句的优化作用: 案例1.拷贝文件2.移除文件中的病毒代码

Python文件操作

1.以指定的方式, 打开文件:open

fp = open("xxx.txt",'w',encoding="utf-8") fp.write("中国") fp.close

fp = open("xxx.txt",'w',encoding="utf-8")

只有open("xxx.txt")时,目的是获取文件句柄,如果没有该文件将会自动创建“xxx.txt”文件(无关打开之后的操作类型)

但是:如果使用r,没有未找到改文件名,将会报错:FileNotFoundError: [Errno 2] No such file or directory: 'xxxx.txt'

w,a不会出现这种情况,它们会直接创建文件

只有open("xxx.txt",'w')Python2默认是UTF-8编码,但是Python3将会根据系统(WINDOWS,MAC,LINUX)编码方式(中文简体是GBK)进行编码

utf-8与Unicode的区别主要区别在于:Unicode为世界上所有字符都分配了一个唯一的数字编号,UTF-8是Unicode编码的一种实现

r:读

w:写

a:追加

r+:读写方式打开文件

特征案例:

原文档为“汪帅是个”写入“老毛”结果:“老毛是个”

也就是指针从文档开始部分写入文件

w+:读写方式打开文件

与w操作相同。

但是,特征案例中:

fp = open("xxx.txt",'w+')步骤总是先使用“xxx.txt”替换原始文件,然后再写入也就是说fp = open("xxx.txt",'w+')后面紧跟着fp.read(),也只能读出空字符

因此,使用W+是一种方式,先写再读

但是,这时候要读的话,文件指针在文件最末尾还是读取的空字符

因此,必须把文件指针,移动到自己想要的位置处

例如,移动到最前面:fp.seek(0,0)

a+:追加和读的方式

fp = open('xxxx.txt','a+') fp.write('\n'+"中国"*2) str = fp.read() print(str) fp.close()

文件指针一样,这时候读取的是空字符

报错

Unicode编解码问题详解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YOpqAKeJ-1570455739106)(C:\Users\蚩尤克里里\AppData\Roaming\Typora\typora-user-images\1570444538053.png)]

#fp = open("xxx.txt",'r',encoding='utf-8')#相当于告诉open函数以‘utf-8打开文件’ #fp.write("中国") fp = open('xxx.txt','rb') str = fp.read() print(str.decode('utf-8')) fp.close()

2.以指定方式,读取文件:read readline等

read函数

默认:全部读取指定字节:read(5)即为读取前五个字节

按行读取

每次读取一行:readline()

任务:使用readline遍历文件中所有的行数据

注意:无法使用for循环的,只能采用while循环 while True: line = fp.readline() if not line:#如果没有这一行,break break #相应操作 print(line)

按行的形式将所有文件读取完:readlines()

此时:可以用for循环遍历fp.readlines()

遍历文件指针对象:最简单的按照行读取的方法

fp = open(fname,'r') for line in fp: print(line) # line是字符串属性,但它代表一行字符串 # fp虽然是指针,但它代表整个字符串 fp.close fp作为文件指针 实质是一个迭代器,因此在for循环中可以不断迭代

3.以指定方式,写入文件:write/writelines

fp.writelines(['a','c','b'])

注意writeline不会换行

write函数只能写入字符串

TypeError: write() argument must be str, not list

writelines函数参数能写入数组

4.tell函数返回当前文件指针在文件中的位置

fp.tell()

5.seek函数定位文件指针

seek(offset,from) # offset:偏移量,可正可负 # from:相对位置,0表示开头,1表示从当前位置,2表示文件末尾

6.flush函数立即写入文件

fp.flush()

7.关闭文件的规范操作

文件读取接着写入应该用“try……except……finally……”包围起来,以免数据丢失 try: fp = open('fname','r+') fp.read() fp.write() except: print('Error') finally: f.close()

使用with语句优化文件操作:

with open('fname','r+') as fp: fp.read() fp.write() # ……
with语句的优化作用:
无需写try……except……finally……相当于fp = open('fname','r+')不仅仅是针对文件的打开关闭操作实质是上下文管理器:是一种支持 __enter__和 __exit__这两个方法的对象

案例

1.拷贝文件

#思路1:A文件=>[]=>B文件 fname = "【问题】十万个为什么记录本" lines = [] with open(fname+".txt",'r',encoding='utf-8') as fp: for line in fp: lines.append(line) with open(fname+"Copy.txt",'w') as fp1: fp1.writelines(lines) Error1:for line in fp:line是字符串(本质是指针对象)Error2:lines = []是数组,lines.append(line) 我犯的错误是:lines = fp.append(line)逻辑不通!!! #思路2:A文件=>B文件 fname = "【问题】十万个为什么记录本" # lines = [] # with open(fname+".txt",'r',encoding='utf-8') as fp: # for line in fp: # lines.append(line) # with open(fname+"Copy.txt",'w') as fp1: # fp1.writelines(lines) with open(fname+".txt",'r',encoding='utf-8') as fp: with open(fname+"Copy.txt",'w') as fp1: for line in fp: fp1.write(line)

2.移除文件中的病毒代码

# 思路:使用<string>.startswith("string")函数 lines = [] for line in fp: if line.startswith("<script ……………………>"): is_virus = True #忽视第一行 elif line.startswith("<script>"): is_virus = False#忽视最后一行 else: if not is_virus:#拦截所有的is_virus = True状态下的“行” lines.append(line) startswith()函数else: if not is_virus: lines.append(line)上述代码块,很好的忽视了病毒代码
最新回复(0)