Pyth技术基础编程 7_第1页
Pyth技术基础编程 7_第2页
Pyth技术基础编程 7_第3页
Pyth技术基础编程 7_第4页
Pyth技术基础编程 7_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章文件操作文件基本概念文件的基本操作CSV和JSON文件操作文件操作的异常处理文件与目录管理主要内容0102030405文件基本概念01文件的概念与分类文本文件通常以字符为单位读写,而二进制文件以字节为单位读写。在Python中,文件操作的模式(如r、rb)决定了文件的处理方式。1.文本文件以字符形式存储数据:.txt、.csv、.json等。可以直接用文本编辑器打开和编辑。内容是人们可识读的,通常用于存储配置信息、日志、代码等。处理方式以字符为单位,适合逐行读取或写入。2.二进制文件以二进制形式存储数据:图片(.jpg、.png)、音频(.mp3)、视频(.mp4)等。需要特定的程序才能解析,其内容是机器可读的,通常用于存储非文本数据。处理方式以字节为单位,适合处理大文件或复杂数据结构。文件编码与解码1.常见编码方式ASCII编码最早的字符编码标准,仅支持英文字符和部分控制字符,适用于纯英文文本,不支持其他语言的字符。使用7位二进制数表示字符,共128个字符。UTF-8编码是一种变长的Unicode编码,支持全球所有语言的字符,是当前最常用的编码方式,兼容ASCII。使用1到4个字节表示一个字符,适合存储多语言文本。其他编码方式GBK:主要用于中文字符编码。ISO-8859-1:支持西欧语言字符。文件编码与解码2.Python中的编码处理在Python中,文件编码可以通过open()函数的encoding参数指定。#以UTF-8编码读取文件withopen("example.txt","r",encoding="utf-8")asfile:content=file.read()如果文件的编码与指定的编码不一致,可能会导致

UnicodeDecodeError,为了避免这种问题,可以尝试以下方法:withopen("example.txt","r",encoding="utf-8",errors="ignore")asfile:content=file.read()#忽略无法解码的字符方法二:使用

chardet

库自动检测文件编码importchardet

withopen("example.txt","rb")asfile:

raw_data=file.read()result=chardet.detect(raw_data)encoding=result["encoding"]print(f"检测到的编码:{encoding}")方法一:使用errors参数处理编码错误文件编码与解码3.编码与解码的实际应用如果需要将文件从一种编码转换为另一种编码,可以使用以下方法。如果二进制数据中包含文本信息,可以使用decode()方法将其解码为字符串。withopen("source.txt","r",encoding="gbk")assource_file:content=source_file.read()withopen("target.txt","w",encoding="utf-8")astarget_file:target_file.write(content)binary_data=b"Hello,World!"text=binary_data.decode("utf-8")#将二进制数据解码为字符串print(text)如果字符串中包含二进制数据,可以使用encode()方法将其编码为二进制。text="Hello,World!"binary_data=text.encode("utf-8")#将字符串编码为二进制数据print(binary_data)文件的基本操作02文件的打开与关闭1.文件的打开open()函数用于打开文件并返回文件对象,语法如下:open(file,mode='r',encoding=None,errors=None,newline=None,buffering=-1)File(必选):文件路径(相对或绝对路径),例如"data/example.txt"。Mode(可选):文件打开模式(详见表1),默认为'r'(只读)。encoding(可选):文本文件的编码方式(如'utf-8'),默认依赖系统,建议显式指定。errors(可选):编码错误处理策略(如'ignore'忽略错误)。newline(可选):换行符处理(如None表示自动识别系统换行符)。表1文件打开模式模式描述r只读模式(默认)。如果文件不存在,会抛出

FileNotFoundError。w写入模式。如果文件存在,会覆盖文件内容;如果文件不存在,会创建新文件。a追加模式。如果文件存在,在文件末尾添加内容;如果文件不存在,会创建新文件。b二进制模式(如rb、wb)。用于处理二进制文件(如图片、音频等非文本文件)+读写模式(如r+、w+)。允许同时读写文件。

#二进制文件操作(如图片复制)withopen("image.jpg","rb")assrc_file:data=src_file.read()withopen("copy.jpg","wb")asdst_file:dst_file.write(data)#文本文件读写(显式指定编码)withopen("example.txt","r",encoding="utf-8")asfile:content=file.read()文件的打开与关闭2.文件的关闭可以释放系统资源,并确保文件内容被正确写入磁盘。如果忘记关闭文件,可能会导致资源泄露或文件内容未正确保存。使用close()方法关闭文件,一旦文件被关闭,就不能再对其进行读写操作了。关闭文件可以释放系统资源,是一个良好的编程习惯。语法:file.close()#file:一个打开的文件对象。file=open("example.txt","r")#以只读模式打开文件try:content=file.read()#读取文件中的内容finally:

file.close()#关闭文件文件的打开与关闭3.with语句的使用可以自动处理文件的打开和关闭,避免资源泄露。在with语句块结束后,文件会自动关闭,即使发生异常也不会影响文件的关闭。withopen("example.txt","r")asfile:content=file.read()文件的读写操作1.读取文件(1)read():读取整个文件内容用于一次性读取文件的全部内容,适合处理小文件;如果用于读取大文件,可能会占用过多内存。withopen("example.txt","r")asfile:content=file.read()#读取整个文件print(content)

withopen("image.jpg","rb")asfile:data=file.read()#读取二进制数据(2)readline():读取一行内容用于逐行读取文件内容,适合处理大文件或需要逐行处理的场景。withopen("example.txt","r",encoding="utf-8")asfile:line=file.readline()#读取一行

whileline:#逐行读取直到文件末尾

print(line.strip())#去除行末换行符

line=file.readline()(3)readlines():读取所有行并返回列表将文件的所有行读取到一个列表中,适合需要一次性处理所有行的场景;如果用于读取大文件,可能会占用过多内存。withopen("example.txt","r",encoding="utf-8")asfile:lines=file.readlines()#读取所有行

forlineinlines:print(line.strip())文件的读写操作2.写入文件(1)write():写入字符串将字符串写入文件#写入模式(覆盖文件)withopen("output.txt","w",encoding="utf-8")asfile:

file.write("Hello,World!\n")#写入一行

#追加模式(在文件末尾添加内容)withopen("output.txt","a",encoding="utf-8")asfile:

file.write("Thisisanewline.\n")#追加一行

#读写模式(读取后写入)withopen("example.txt","r+",encoding="utf-8")asfile:content=file.read()#读取内容

file.write("Newcontent")#写入新内容

#写入二进制数据withopen("copy.jpg","wb")asfile:

file.write(data)#写入二进制数据(2)writelines():写入字符串列表用于将字符串列表写入文件。需要注意的是,writelines()不会自动添加换行符,需在字符串中显式包含\n。lines=["Line1\n","Line2\n","Line3\n"]withopen("output.txt","w",encoding="utf-8")asfile:

file.writelines(lines)#写入多行文件的读写操作3.文件指针操作(1)tell():返回文件指针的当前位置withopen("example.txt","r",encoding="utf-8")asfile:print(file.tell())#输出当前文件指针位置

content=file.read(10)#读取10个字符print(file.tell())#输出读取后的文件指针位置(2)seek(offset,whence):移动文件指针到指定位置offset:偏移量。whence:参考位置,可选值:0-文件开头(默认);1-当前位置;2-文件末尾。withopen("example.txt","r",encoding="utf-8")asfile:

file.seek(10)#将文件指针移动到第10字节

print(file.read(5))#读取5个字符文件与目录管理03Path的基本用法frompathlibimportPath

#创建Path对象file_path=Path("data/example.txt")#相对路径abs_path=Path("/home/user/data/file.txt")#绝对路径pathlib

是Python3.4+官方推荐的文件操作库,适合新手快速写出健壮代码。对于初学者来说,优先掌握

Path

对象的常用方法(如read_text(),write_text(),glob())。文件操作1.重命名文件old_file=Path("old.txt")new_file=old_file.rename("new.txt")

#将old.txt重命名为new.txt2.删除文件3.检查文件是否存在4.复制文件5.移动文件file=Path("file.txt")file.unlink()

#删除file.txt,如果文件不存在,会抛出

FileNotFoundErrorfile=Path("file.txt")iffile.exists():print("文件存在")else:print("文件不存在")importshutilsrc=Path("source.txt")dst=Path("destination.txt")shutil.copy(src,dst)src=Path("source.txt")dst=Path("destination.txt")src.replace(dst)

#移动文件(若目标存在则覆盖)目录操作1.创建目录(1)创建单层目录:使用Path.mkdir()dir_path=Path("new_dir")dir_path.mkdir()#创建

new_dir

目录,如果目录已存在,会抛出

FileExistsError(2)递归创建多层目录dir_path=Path("dir1/dir2/dir3")dir_path.mkdir(parents=True,exist_ok=True)#parents=True允许创建父目录,exist_ok=True忽略已存在错误目录操作2.

删除目录(1)删除空目录:使用Path.rmdir()(2)递归删除目录:需结合

shutil.rmtree()empty_dir=Path("empty_dir")empty_dir.rmdir()#删除空目录,如果目录不为空,会抛出

OSErrorimportshutildir_path=Path("dir")shutil.rmtree(dir_path)#递归删除目录及其内容,如果目录不存在,会抛出

FileNotFoundError目录操作3.

遍历目录(1)列出目录中的文件和子目录:Path.iterdir()(2)递归遍历目录树:使用

Path.glob()或

Path.rglob()dir_path=Path("my_dir")forentryindir_path.iterdir():#遍历目录中的文件和子目录

print()dir_path=Path("my_dir")#遍历所有.txt文件forfileindir_path.glob("**/*.txt"):print(file)路径操作1.路径拼接使用

/

运算符拼接路径。base_dir=Path("data")sub_dir=base_dir/"subdir"/"example.txt"#等价于data/subdir/example.txt路径操作2.获取路径信息(1)绝对路径relative_path=Path("example.txt")absolute_path=relative_path.absolute()#获取绝对路径(2)父目录file_path=Path("/home/user/data/file.txt")parent_dir=file_path.parent

#输出/home/user/data(3)文件名与后缀file_path=Path("data/file.txt")print(file_)#输出file.txtprint(file_path.stem)#输出fileprint(file_path.suffix)#输出.txt路径操作3.检查路径信息(1)是否为文件(2)是否为目录path=Path("example.txt")print(path.is_file())#True或Falsepath=Path("my_dir")print(path.is_dir())#True或False高级操作1.读取/写入文件内容file=Path("example.txt")

#读取文件内容content=file.read_text(encoding="utf-8")

#写入文件内容file.write_text("Hello,World!",encoding="utf-8")2.复制目录importshutilsrc=Path("source_dir")dst=Path("destination_dir")shutil.copytree(src,dst)3.筛选文件dir_path=Path("my_dir")

#匹配当前目录的.txt文件forfileindir_path.glob("*.txt"):print(file)

#递归匹配所有.txt文件forfileindir_path.rglob("*.txt"):print(file)CSV和JSON文件操作04CSV文件操作1.读取CSV文件(1)使用

csv.reader

可以逐行读取CSV文件importcsvwithopen("data.csv","r",encoding="utf-8")asfile:reader=csv.reader(file)forrowinreader:print(row)#每行是一个列表注意:如果CSV文件包含标题行,可以使用next(reader)

跳过标题行。(2)csv.DictReader

将每行数据转换为字典,字典的键是标题行的字段名importcsvwithopen("data.csv","r",encoding="utf-8")asfile:reader=csv.DictReader(file)forrowinreader:print(row)#每行是一个字典CSV文件操作2.写入CSV文件(1)使用

csv.writer

可以将数据写入CSV文件注意:newline=""参数用于避免在Windows系统中出现空行importcsvdata=[["Name","Age"],["李华",25],["张明",30]]withopen("output.csv","w",encoding="utf-8",newline="")asfile:writer=csv.writer(file)

writer.writerows(data)#写入多行数据(2)csv.DictWriter

可以将字典形式的数据写入CSV文件importcsvdata=[{"Name":"李华","Age":25},{"Name":"张明","Age":30}]withopen("output.csv","w",encoding="utf-8",newline="")asfile:fieldnames=["Name","Age"]writer=csv.DictWriter(file,fieldnames=fieldnames)

writer.writeheader()#写入标题行

writer.writerows(data)#写入多行数据JSON文件操作1.读取JSON文件使用

json.load()

可以从JSON文件中读取数据。importjsonwithopen("data.json","r",encoding="utf-8")asfile:data=json.load(file)#读取JSON数据

print(data)注意:json.load()返回一个Python字典或列表JSON文件操作2.写入JSON文件使用

json.load()可以将数据写入JSON文件注意:indent

参数用于指定缩进空格数,使输出更易读importjson

data={"name":"Alice","age":25,"hobbies":["reading","traveling"]}

withopen("output.json","w",encoding="utf-8")asfile:

json.dump(data,file,indent=4)#写入JSON数据,indent用于美化输出文件操作的异常处理05文件操作常见异常触发场景:输入输出操作失败6.IOError触发场景:尝试以错误的编码读取文件。3.UnicodeDecodeError触发场景:尝试以文件操作方式处理目录4.json.JSONDecodeError5.IsADirectoryError触发场景:尝试访问没有权限的文件或目录1.FileNotFoundError2.PermissionErrorwithopen("missing_file.txt","r")asfile:content=file.read()#如果missing_file.txt不存在,会抛出FileNotFoundError触发场景:尝试打开不存在的文件withopen("/root/protected_file.txt","r")asfile:content=file.read()#如果没有权限访问/root/protected_file.txt,会抛出

PermissionErrowithopen("example.txt","r",encoding="utf-8")asfile:content=file.read()#如果example.txt不是UTF-8编码,会抛出

UnicodeDecodeErrorwithopen("my_directory","r")asfile:content=file.read()#如果

my_directory

是一个目录,会抛出

IsADirectoryErrorimportjsonwithopen("invalid.json","r")asfile:data=json.load(file)#如果

invalid.json

不是有效的JSON格式,会抛出json.JSONDecodeError触发场景:尝试解析格式错误的JSON文件withopen("file.txt","r")asfile:content=file.read()#如果磁盘损坏或文件被占用,可能会抛出

IOError文件操作异常处理1.捕获特定异常通过捕获特定异常,可以针对不同的错误类型采取不同的处理措施。try:withopen("missing_file.txt","r")asfile:content=file.read()exceptFileNotFoundError:print("文件未找到!")exceptPermissionError:print("权限不足!")except

UnicodeDecodeError:print("文件编码错误!")exceptExceptionase:print(f"发生未知错误:{e}")finally:print("操作完成。")

#finally块中的代码无论是否发生异常都会执行,适合用于释放资源或清理操作文件操作异常处理2.捕获多个异常可以将多个异常合并到一个except块中处理try:withopen("file.txt","r")asfile:content=file.read()except(FileNotFoundError,PermissionError)ase:print(f"文件操作失败:{e}")文件操作异常处理3.处理JSON解析异常在解析JSON文件时,可能会遇到格式错误,可以通过捕获

json.JSONDecodeError

进行处理。importjs

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论