2021-06-20

第十四周Python笔记

文件操作
按文件中数据的组织形式把文件分为文本文件和二进制文件两类。
文本文件:文本文件存储的是常规字符串,由若干文本行组成,通常每行以换行符’\n’结尾。常规字符串是指记事本或其他文本编辑器能正常显示、编辑并且人类能够直接阅读和理解的字符串,如英文字母、汉字、数字字符串。文本文件可以使用字处理软件如gedit、记事本进行编辑。
二进制文件:二进制文件把对象内容以字节串(bytes)进行存储,无法用记事本或其他普通字处理软件直接进行编辑,通常也无法被人类直接阅读和理解,需要使用专门的软件进行解码后读取、显示、修改或执行。常见的如图形图像文件、音视频文件、可执行文件、资源文件、各种数据库文件、各类office文档等都属于二进制文件。
文件内容操作三步走:打开、读写、关闭。
open(file, mode=‘r’, buffering=-1, encoding=None, errors=None,
newline=None, closefd=True, opener=None)
file参数指定了被打开的文件名称。
mode参数指定了打开文件后的处理方式。
buffering参数指定了读写文件的缓存模式。0表示不缓存,1表示缓存,如大于1则表示缓冲区的大小。默认值是缓存模式。
encoding参数指定对文本进行编码和解码的方式,只适用于文本模式,可以使用Python支持的任何格式,如GBK、utf8、CP936等等。
如果执行正常,open()函数返回1个文件对象,通过该文件对象可以对文件进行读写操作。如果指定文件不存在、访问权限不够、磁盘空间不足或其他原因导致创建文件对象失败则抛出异常。

f1 = open(‘file1.txt’, ‘r’) # 以读模式打开文件
f2 = open(‘file2.txt’, ‘w’) # 以写模式打开文件

当对文件内容操作完以后,一定要关闭文件对象,这样才能保证所做的任何修改都确实被保存到文件中。
f1.close()
但是,即使写了关闭文件的代码,也无法保证文件一定能够正常关闭。在管理文件对象时推荐使用with关键字,可以有效地避免这个问题。

with语句的用法如下:

with open(filename, mode, encoding) as fp:
#这里写通过文件对象fp读写文件内容的语句

上下文管理语句with还支持下面的用法:

with open(‘test.txt’, ‘r’) as src, open(‘test_new.txt’, ‘w’) as dst:
dst.write(src.read())
如果需要处理文件路径,可以使用os.path模块中的对象和方法;
如果需要使用命令行读取文件内容可以使用fileinput模块;
创建临时文件和文件夹可以使用tempfile模块;
递归遍历文件夹(深度优先)
from os import listdir
from os.path import join, isfile, isdir

def listDirDepthFirst(directory):
‘’‘深度优先遍历文件夹’’’
#遍历文件夹
#如果是文件就直接输出
#如果是文件夹,就输出显示,然后递归遍历该文件夹
for subPath in listdir(directory):
path = join(directory, subPath)
if isfile(path):
print(path)
elif isdir(path):
print(path)
listDirDepthFirst(path)
遍历指定文件夹(广度优先)
def listDirWidthFirst(directory):
‘’‘广度优先遍历文件夹’’’
dirs = [directory]
#如果还有没遍历过的文件夹,继续循环
while dirs:
#遍历还没遍历过的第一项
current = dirs.pop(0)
#遍历该文件夹,如果是文件就直接输出显示
#如果是文件夹,输出显示后,标记为待遍历项
for subPath in listdir(current):
path = join(current, subPath)
if isfile(path):
print(path)
elif isdir(path):
print(path)
dirs.append(path)
使用os.walk函数遍历
import os

def visitDir2(path):
if not os.path.isdir(path):
print(‘Error:"’,path,’" is not a directory or does not exist.’)
return
list_dirs = os.walk(path) #os.walk返回一个元组,包括3个元素:
#所有路径名、所有目录列表与文件列表
for root, dirs, files in list_dirs: #遍历该元组的目录和文件信息
for d in dirs:
print(os.path.join(root, d)) #获取完整路径
for f in files:
print(os.path.join(root, f)) #获取文件绝对路径

visitDir2(‘h:\music’)
比较两个文本文件内容是否相同。

import difflib

A = open(‘c:\dir.txt’,‘r’)
B = open(‘c:\dir1.txt’,‘r’)
contentA = A.read()
contentB = B.read()
s = difflib.SequenceMatcher(lambda x:x=="",contentA,contentB)
result = s.get_opcodes()
for tag,i1,i2,j1,j2 in result:
print("%s contentA[%d:%d]=%s contentB[%d:%d]=%s"%
(tag,i1,i2, contentA [i1:i2],j1,j2, contentB[j1:j2]))

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值