python学习-文件读写

114 阅读9分钟

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

编码是将字符转换为计算机可以存储和处理的格式的过程,不同的编码格式能够表示不同的字符集。

常见的编码格式

  • ASCIIASCII(美国信息交换标准代码)是一种基于拉丁字母的编码标准,只能表示英文字符和一些特殊符号,共128个字符。优点是简单且兼容性好,缺点是不支持非英文字符
  • UTF-8UTF-8 是一种变长字符编码,它使用1到4个字节表示一个字符,能够表示世界上几乎所有的字符。它是互联网上最常用的编码格式,因为它向后兼容ASCII,并且对中文、日文、韩文等多语言支持良好。
  • GBKGBK(汉字内码扩展规范)是一种用于简体中文的扩展编码集,是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-study