python学习-文件读写
本文介绍 python 的文件读写相关知识点:文件路径、读取文件、写入文件、shutil 模块、解压缩 zipFile、编码格式 encoding和剪切板 pyperclip。
供自己以后查漏补缺,也欢迎同道朋友交流学习。
引言
在之前的文章中,有简单的介绍过文件读写相关的内容,但比较简单,实际应用场景下会更复杂一点,所以这篇文章主要介绍文件读写相关的文件路径、读取文件、写入文件、shutil
模块、解压缩 zipFile
、编码格式 encoding
和剪切板 pyperclip
等知识点。
文件路径
路径的概念
文件路径是操作系统用来定位文件或目录的字符串。它指定了文件系统中文件或目录的具体位置。
绝对路径与相对路径
- 绝对路径:包含从根目录(在
Unix
系统中是/
,在Windows
系统中是盘符,如C:\
)到目标文件或目录的完整路径。例如,在Unix
系统中,/home/user/documents/report.txt
是一个绝对路径
。 - 相对路径:相对于当前工作目录的路径。如果当前工作目录是
/home/user
,那么documents/report.txt
就是一个相对路径
,它指向/home/user/documents/report.txt
。
路径操作
在 Python
中,os.path
模块提供了许多用于路径操作的函数。
import os
# 当前文件所在的目录
print(os.getcwd())
# 输出: /Users/.../python-study/file
# 将目录和文件名连接起来
# os.path.join()函数用于连接两个或多个路径部分,
# 并且会自动处理不同操作系统中的路径分隔符。
file_path = os.path.join('/home/user', 'documents', 'report.txt')
print(file_path)
# 输出: /home/user/documents/report.txt
# 获取路径的绝对路径
print(os.path.abspath(__file__))
# 输出: /Users/.../python-study/file/file1.py
# 检查指定的路径是否存在。它返回True如果路径存在,否则返回False
print(os.path.exists('/home/user'))
# 输出: False
# 检查路径是否为目录
print(os.path.isdir('/Users'))
# 输出: True
# 检查路径是否为文件
print(os.path.isfile('/Users'))
# 输出: False
写入文件
写入文件需要使用 open()
函数,然后选择一个合适的文件模式。
写入文件的方法
write()
:写入文本。writelines()
:写入多行。
# write()方法用于将字符串写入文件。
# 如果文件不存在,write()方法将会创建一个新文件。
with open('example1.txt', 'w') as file:
file.write("Hello, World!\n") # \n用于换行
# writelines()方法用于将字符串列表写入文件。
# 与write()不同,writelines()不会在字符串之间添加任何额外的字符。
lines = ["Hello, World!\n", "Hello, NiuNai!\n"]
with open('example2.txt', 'w') as file:
file.writelines(lines)
文件模式
文件模式决定了文件如何被打开,不同的模式适用于不同的场景:
- 'r':以
只读
方式打开文件。如果文件不存在,抛出异常。 - 'r+':以
读写
方式打开文件。如果文件不存在,抛出异常。 - 'w':以
写入
方式打开文件,如果文件存在,则覆盖文件;如果文件不存在,创建新文件。 - 'w+':以
读写
方式打开文件,如果文件存在,则覆盖文件;如果文件不存在,创建新文件。 - 'a':以
追加
方式打开文件,如果文件存在,则写入的数据会追加到文件末尾;如果文件不存在,创建新文件。 - 'a+':以
读写
方式打开文件,如果文件存在,则写入的数据会追加到文件末尾;如果文件不存在,创建新文件。
异常处理
使用 try...except
来处理文件写入时可能出现的异常。
try:
with open('output.txt', 'w') as file:
file.write("Hello, World!")
except IOError as e:
print(f"IO错误: {e.strerror}")
except Exception as e:
print(f"异常错误: {e}")
读取文件
读取文件是一个常见的操作,可以通过内置的 open()
函数来实现。
读取文件的方法
# read()方法用于读取文件的全部内容,并返回一个字符串。
with open('example1.txt', 'r') as file:
content = file.read()
print(content)
# 输出:Hello, World!
# readline()方法用于读取文件的一行内容,并返回一个字符串。
# 如果文件末尾已经到达,则返回一个空字符串。
with open('example2.txt', 'r') as file:
line = file.readline()
print(line)
# 输出:Hello, World!
# readlines()方法用于读取文件的所有行,并将它们作为一个字符串列表返回。
with open('example2.txt', 'r') as file:
lines = file.readlines()
for line in lines:
print(line.strip()) # strip()用于移除字符串末尾的换行符
# 输出:Hello, World!
# Hello, NiuNai!
读取文件的文件模式
读取文件的文件模式和上面的写入是相同的。
shutil 模块
shutil
模块是 Python
标准库的一部分,提供了许多高级文件操作功能,包括文件复制
、移动
、删除
以及文件压缩
和解压缩
等。
文件和目录操作
import shutil
# 复制单个文件
# shutil.copy(src, dst)函数用于复制文件。
# src是源文件路径,dst是目标路径。如果目标路径已经存在一个文件,它将被覆盖。
shutil.copy('source.txt', 'destination.txt')
# 复制文件并保留元数据
# shutil.copy2(src, dst)函数与shutil.copy()类似,
# 但它还会尝试复制文件的元数据(如修改时间和权限)。
shutil.copy2('source.txt', 'destination2.txt')
# shutil.move(src, dst)函数用于移动文件或目录。
# 如果dst是一个目录,源文件将被移动到该目录下。
shutil.move('source.txt', 'new_directory/destination.txt')
# 删除目录及其内容
shutil.rmtree('new_directory')
文件压缩与解压缩
# 创建一个zip压缩文件
# shutil.make_archive(base_name, format, [root_dir], [base_dir])函数用于创建一个压缩文件。
# base_name是压缩文件的名称(不包括格式),
# format是压缩格式(如zip、tar等),
# root_dir是根目录(可选),
# base_dir是相对于root_dir的目录(可选)。
shutil.make_archive('archive', 'zip', 'new_directory')
# 解压一个zip压缩文件
# shutil.unpack_archive(filename, extract_dir, [format])函数用于解压压缩文件。
# filename是压缩文件的路径,
# extract_dir是解压目标目录,
# format是压缩格式(可选,如果未指定,将自动检测格式)。
shutil.unpack_archive('archive.zip', 'extract_directory')
文件压缩与解压缩zipFile
上面讲的 shutil
模块适合快速打包整个目录成多种压缩格式
,而 zipfile
模块专门用于更细致
地操作 ZIP
文件。下面是 zipfile
模块的一些常用方法:
ZipFile 类
ZipFile
类是 zipfile
模块中用于读取和创建 ZIP
文件的核心类。
import zipfile
# 创建一个创建ZIP文件
# mode参数指定打开文件的模式,'r'表示只读,'w'表示写入。
with zipfile.ZipFile('new_zip_file.zip', 'w') as zipf:
zipf.write('file1.py')
zipf.write('file2.py')
# 读取一个ZIP文件
with zipfile.ZipFile('new_zip_file.zip', 'r') as zipf:
# 列出ZIP文件中的所有文件
print(zipf.namelist())
# 输出:['file1.py', 'file2.py']
ZipFile常用方法
# is_zipfile()函数用于检查一个文件是否是ZIP文件格式。
is_zip = zipfile.is_zipfile('archive.zip')
print(is_zip)
# 输出:True
# open()方法用于打开ZIP文件中的一个文件并返回一个文件对象,可以用于读取ZIP内部文件的内容。
with zipfile.ZipFile('archive.zip', 'r') as zipf:
with zipf.open('destination.txt') as file:
content = file.read()
print(content.decode('utf-8'))
# 输出:我是源文件
# read()方法用于读取ZIP文件中指定文件的内容。
with zipfile.ZipFile('archive.zip', 'r') as zipf:
content = zipf.read('destination.txt')
print(content.decode('utf-8'))
# 输出:我是源文件
# extract()方法用于从ZIP文件中提取指定的文件到指定的路径。
with zipfile.ZipFile('new_zip_file.zip', 'r') as zipf:
zipf.extract('file1.py', 'new_flie1_dir')
# extractall()方法用于提取ZIP文件中的所有文件到指定的路径。
with zipfile.ZipFile('new_zip_file.zip', 'r') as zipf:
zipf.extractall('new_flie_all')
认识编码格式encoding
编码
是将字符转换为计算机可以存储和处理的格式的过程,不同的编码格式能够表示不同的字符集。
常见的编码格式
- ASCII:
ASCII
(美国信息交换标准代码)是一种基于拉丁字母
的编码标准,只能表示英文字符和一些特殊符号,共128个字符。优点是简单且兼容性好,缺点是不支持非英文字符
。 UTF-8
:UTF-8
是一种变长字符编码,它使用1到4
个字节表示一个字符,能够表示世界上几乎所有的字符。它是互联网上最常用的编码格式,因为它向后兼容ASCII,并且对中文、日文、韩文等多语言支持良好。- GBK:
GBK
(汉字内码扩展规范)是一种用于简体中文的扩展编码集,是GB2312
的扩展,可以表示更多的中文字符和符号。它主要用于简体中文
环境,但不支持其他语言的字符。
处理编码问题
在读写文件时,指定正确的编码格式是非常重要的,以确保文件内容的正确性和完整性。以下是一些处理编码问题的技巧:
读写文件时指定编码
在使用 open()
函数读写文件时,通过 encoding
参数指定编码格式。
例如 open('filename.txt', 'r', encoding='utf-8')
以 UTF-8 编码读取文件。
处理编码错误
在读写过程中,如果遇到编码错误,可以通过 errors
参数指定错误处理方式,如ignore
(忽略错误)、replace
(用替代字符替换错误字符)等。
例如 open('filename.txt', 'r', encoding='utf-8', errors='replace')
。
转换编码
如果需要将一种编码格式的字符串转换为另一种编码格式,可以使用字符串的 encode()
和 decode()
方法。
例如将 UTF-8
编码的字符串转换为 ASCII
编码:utf8_string.encode('ascii')
。
剪贴板pyperclip模块
pyperclip
是一个第三方 Python
模块,它提供了一个简单的跨平台接口来复制和粘贴剪贴板内容。
由于 Python
的标准库并没有直接提供剪贴板操作的功能,pyperclip
成为了一个非常实用的工具。
安装pyperclip
pip install pyperclip
# or
pip3 install pyperclip
pyperclip复制粘贴
import pyperclip
# 复制文本到剪贴板
# 使用 pyperclip.copy(text) 函数可以将文本复制到系统的剪贴板中。
text_to_copy = "Hello, World!"
pyperclip.copy(text_to_copy)
# 从剪贴板粘贴文本:
# 使用 pyperclip.paste() 函数可以从剪贴板中获取文本。
pasted_text = pyperclip.paste()
print(pasted_text)
# 输出: Hello, World!
pyperclip应用场景
- 自动化脚本:在编写自动化脚本时,可能需要自动复制某些文本或文件路径,
pyperclip
可以在这些场景下简化操作。 - 快速文本处理:在处理文件或文本数据时,可以快速复制和粘贴数据,提高工作效率。
- 跨平台兼容性:支持多个操作系统(Windows、macOS、Linux),它在开发跨平台应用时非常有用。
python学习专栏系列
- python学习-基础学习1
- python学习-基础学习2
- python学习-基础学习3
- python学习-面向对象编程1
- python学习-面向对象编程2
- python学习-文件读写
- python学习-程序异常处理
- python学习-正则
- python学习-处理word文档
- python学习-处理pdf文档
- python学习-处理excel文档
- python学习-处理csv文档
- python学习-使用matplotlib绘制图表
- python学习-处理JSON数据
- python学习-SQLite数据库
- python学习-多线程处理
- python学习-网络爬虫