Python文件处理(IO 技术)-2

简介: Python文件处理(IO 技术)

Python文件处理(IO 技术)-1

https://developer.aliyun.com/article/1537870


五、文件对象的常用属性和方法

文件对象的属性
属性 说明
name 返回文件的名字
mode 返回文件的打开模式
closed 若文件被关闭则返回 True


文件对象的打开模式

文件对象的常用方法

六、文件任意位置操作

【示例】 seek()移动文件指针示例

with open('中文乱码.txt', 'r', encoding='utf-8') as f:
    print('文件名:{0}'.format(f.name))
    print(f.tell())
    print('读取的内容:{0}'.format(str(f.readline())))
    print(f.tell())
    f.seek(0, 0)
    print('读取的内容:{0}'.format(str(f.readline())))

运行结果:

七、CSV 文件的操作

csv(Comma Separated Values)是逗号分隔符文本格式,常用于数据交换、Excel文件和数据库数据的导入和导出。

与 Excel 文件不同,CSV 文件中:

  • 值没有类型,所有值都是字符串
  • 不能指定字体颜色等样式
  • 不能指定单元格的宽高,不能合并单元格
  • 没有多个工作表
  • 不能嵌入图像图表

Python 标准库的模块 csv 提供了读取和写入 csv 格式文件的对象。


1. csv.reader 对象和 csv 文件读取

【示例】 csv.reader 对象于从 csv 文件读取数据

import csv
with open('豆瓣.csv', 'r', encoding='utf-8') as f:
    read = csv.reader(f)
    for row in read:
        print(row)

运行结果:

csv.writer 对象和 csv 文件写入

【示例】 csv.writer 对象写一个 csv 文件

import csv
headers = ['标题', '类型', '评分', '引言']
rows = [('当幸福来敲门', '剧情 传记 家庭', 9.2, '平民励志片。'),
        ('寻梦环游记', '喜剧 动画 奇幻 音乐', 9.1, '死亡不是真的逝去,遗忘才是永恒的消亡。'),
        ('末代皇帝', '剧情 传记 历史', 9.3, '“不要跟我比惨,我比你更惨”再适合这部电影不过了。')]
with open('豆瓣.csv', 'w', encoding='utf-8', newline='') as f:
    write = csv.writer(f)
    write.writerow(headers)
    write.writerows(rows)

运行结果:

pickle 序列化

Python 中,一切皆对象,对象本质上就是一个“存储数据的内存块”。有时候,我们需要将“内存块的数据”保存到硬盘上,或者通过网络传输到其他的计算机上。这时候,就需要“对象的序列化和反序列化”。 对象的序列化机制广泛的应用在分布式、并行系统上。

序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方。反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。

【示例】 将对象序列化到文件中

import pickle
with open(r"data.dat", "wb") as f:
    a1 = ['ZX', [123], {'age': 18}]
    pickle.dump(a1, f)

【示例】 将获得的数据反序列化成对象

import pickle
with open('data.dat', 'rb') as f:
    a = pickle.load(f)
print(a)

运行结果:

os 和 os.path 模块

os 模块可以帮助我们直接对操作系统进行操作。我们可以直接调用操作系统的可执行文件、命令,直接操作文件、目录等等。在系统运维的核心基础。

os 模块-调用操作系统命令

os.system 可以帮助我们直接调用系统的命令

【示例】 os.system 调用 windows 系统的记事本程序

import os
os.system('cmd')
os.system('regedit')

【示例】 os.system 调用 windows 系统中 ping 命令

import os
os.system("ping www.baidu.com")

运行结果:

os.startfile:直接调用可执行文件

【示例】 运行安装好的微信

import os
os.startfile('D:\软件\微信\WeChat\WeChat.exe')

运行结果:

os 模块-文件和目录操作

os 模块下常用操作文件的方法

os 模块下关于目录操作的相关方法

【示例】 os 模块:创建、删除目录、获取文件信息等

import os
# 获取文件和文件夹相关的信息
print(os.name)  # windows->nt; linux 和 unix->posix
print(os.sep)  # windows->\; linux 和 unix->/
print(repr(os.linesep))  # windows->\r\n;linux-->\n\
print(os.stat('os模块-文件和目录操作.py'))

# 关于工作目录的操作
print(os.getcwd())  # 返回当前工作目录
# os.chdir('d:')  # 改变当前的工作目录为:d:盘根目录

# 创建目录、创建多级目录、删除
os.mkdir('电影')  # 创建目录
os.makedirs('音乐/周杰伦/稻香')  # 创建多级目录
os.makedirs('../电影1')  # ../表示上一级

print(os.listdir('电影'))
os.path 模块

os.path 模块提供了目录相关(路径判断、路径切分、路径连接、文件夹遍历)的操作。

方法 描述
isabs(path) 判断 path 是否绝对路径
isdir(path) 判断 path 是否为目录
isfile(path) 判断 path 是否为文件
exists(path) 判断指定路径的文件是否存在
getsize(filename) 返回文件的大小
abspath(path) 返回绝对路径
dirname§ 返回目录的路径
getatime(filename) 返回文件的最后访问时间
getmtime(filename) 返回文件的最后修改时间
walk(top,func,arg) 递归方式遍历目录
join(path,*paths) 连接多个 path
split(path) 对路径进行分割,以列表形式返回
splitext(path) 从路径中分割文件的扩展名


【示例】 测试 os.path 中常用方法

import os.path
# 是否为绝对路径
print(os.path.isabs('d:/a1.txt'))
# 是否为目录
print(os.path.isdir('d:/a1.txt'))
# 是否为文件
print(os.path.isfile('d:/a1.txt'))
# 文件是否存在
print(os.path.exists('d:/a1.txt'))
# 文件大小
print(os.path.getsize('d:/a1.txt'))
# 输出所在目录
print(os.path.dirname('d:/a1.txt'))
# 返回创建时间
print(os.path.getctime('d:/a1.txt'))
# 返回最后访问时间
print(os.path.getatime('d:/a1.txt'))
# 返回最后修改时间
print(os.path.getmtime('d:/a1.txt'))
# 输出绝对路径
print(os.path.abspath('d:/a1.txt'))
# 返回元组:目录、文件
print(os.path.split('d:/a1.txt'))
# 返回元组:路径、扩展名
print(os.path.splitext('d:/a1.txt'))
# 路径连接
print(os.path.join('d: ', 'python', 'a.txt'))

运行结果:

【示例】 列出指定目录下所有的.py 文件,并输出文件名

# 方法一
import os.path
path = os.getcwd()
file_list = os.listdir(path)
for filename in file_list:
    if filename.endswith('py'):
        print(filename)

# 方法二
import os.path
path = os.getcwd()
file_list = os.listdir(path)
filename = [filename for filename in file_list if filename.endswith('py')]
for f in filename:
    print(f)

walk()递归遍历所有文件和目录

os.walk()方法:

返回一个 3 个元素的元组,(dirpath, dirnames, filenames),

  • dirpath:要列出指定目录的路径
  • dirnames:目录下的所有文件夹
  • filenames:目录下的所有文件

【示例】 使用 walk()递归遍历所有文件和目录

import os

all_files = []
path = os.getcwd()
list_files = os.walk(path)
for dirpath, dirnames, filenames in list_files:
    for dir in dirnames:
        all_files.append(os.path.join(dirpath, dir))
    for name in filenames:
        all_files.append(os.path.join(dirpath, name))
# 打印子目录和子文件
for file in all_files:
    print(file)

运行结果:

shutil 模块(拷贝和压缩)

shutil 模块是 python 标准库中提供的,主要用来做文件和文件夹的拷贝、移动、删除等;还可以做文件和文件夹的压缩、解压缩操作。

os 模块提供了对目录或文件的一般操作。shutil 模块作为补充,提供了移动、复制、压缩、解压等操作,这些 os 模块都没有提供。


【示例】 实现文件的拷贝

import shutil
# copy 文件内容
shutil.copy('1.txt', '1_copy.txt')

【示例】 实现递归的拷贝文件夹内容(使用 shutil 模块)

import shutil
#"音乐"文件夹不存在才能用。
shutil.copytree("电影/学习","音乐",ignore=shutil.ignore_patterns("*.html","*.htm"))

【示例】 实现将文件夹所有内容压缩

import shutil
# 将"电影/学习"文件夹下所有内容压缩到"音乐 2"文件夹下生成 movie.zip
# shutil.make_archive("音乐 2/movie", "zip", "电影/学习")


# 压缩:将指定的多个文件压缩到一个 zip 文件
import zipfile
z = zipfile.ZipFile("a.zip","w")
z.write("1.txt")
z.write("2.txt")
z.close()

运行结果:

【示例】 实现将压缩包解压缩到指定文件夹

import zipfile
# 解压缩:
z2 = zipfile.ZipFile("a.zip", "r")
z2.extractall("d:/")  # 设置解压的地址
z2.close()

运行结果:

递归算法

递归是一种常见的解决问题的方法,即把问题逐渐简单化。递归的基本思想就是“自己调用自己”,一个使用递归技术的方法将会直接或者间接的调用自己。

利用递归可以用简单的程序来解决一些复杂的问题。比如:斐波那契数列的计算、汉诺塔、快排等问题。

递归结构包括两个部分:

  • 定义递归头。
  • 递归体。

【示例】 使用递归求 n!

def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n - 1)
a = factorial(5)
print(a)

运行结果:

【示例】 使用递归算法遍历目录下所有文件

import os
allfile = []

def getFiles(path, level):
    childFiles = os.listdir(path)
    for file in childFiles:
        filepath = os.path.join(path, file)
        if os.path.isdir(filepath):
            getFiles(filepath, level + 1)
        allfile.append("\t" * level + filepath)

getFiles(os.getcwd(), 0)
for f in reversed(allfile):
    print(f)

运行结果:

相关文章
|
4天前
|
前端开发 JavaScript 网络协议
深入理解Python Web开发中的前后端分离与WebSocket实时通信技术
【7月更文挑战第18天】前后端分离采用Flask/Django框架,前端JavaScript框架如Vue.js与后端通过AJAX/Fetch通信。WebSocket提供实时双向通信,Python可借助websockets库或Flask-SocketIO实现。最佳实践包括定义清晰的接口规范,确保安全性(HTTPS,认证授权),优化性能,和健壮的错误处理。结合两者,打造高效实时应用。
17 1
|
5天前
|
并行计算 数据处理 Python
Python并发编程迷雾:IO密集型为何偏爱异步?CPU密集型又该如何应对?
【7月更文挑战第17天】Python并发编程中,异步编程(如`asyncio`)在IO密集型任务中提高效率,利用等待时间执行其他任务。但对CPU密集型任务,由于GIL限制,多线程效率不高,此时应选用`multiprocessing`进行多进程并行计算以突破限制。选择合适的并发策略是关键:异步适合IO,多进程适合CPU。理解这些能帮助构建高效并发程序。
15 6
|
4天前
|
开发框架 并行计算 .NET
从菜鸟到大神:Python并发编程深度剖析,IO与CPU的异步战争!
【7月更文挑战第18天】Python并发涉及多线程、多进程和异步IO(asyncio)。异步IO适合IO密集型任务,如并发HTTP请求,能避免等待提高效率。多进程在CPU密集型任务中更优,因可绕过GIL限制实现并行计算。通过正确选择并发策略,开发者能提升应用性能和响应速度。
|
5天前
|
算法 Java 程序员
解锁Python高效之道:并发与异步在IO与CPU密集型任务中的精准打击策略!
【7月更文挑战第17天】在数据驱动时代,Python凭借其优雅语法和强大库支持成为并发处理大规模数据的首选。并发与异步编程是关键,包括多线程、多进程和异步IO。对于IO密集型任务,如网络请求,可使用`concurrent.futures`和`asyncio`;CPU密集型任务则推荐多进程,如`multiprocessing`;`asyncio`适用于混合任务,实现等待IO时执行CPU任务。通过这些工具,开发者能有效优化资源,提升系统性能。
16 4
|
5天前
|
并行计算 Java 大数据
深度探索:Python异步编程如何优雅征服IO密集型任务,让CPU密集型任务也臣服!
【7月更文挑战第17天】Python的异步编程借助`asyncio`库提升IO密集型任务效率,如并发下载网页,通过`async def`定义协程,`asyncio.gather`并发执行。在CPU密集型任务中,结合`ThreadPoolExecutor`实现并行计算,利用多核优势。`asyncio.run`简化事件循环管理,使Python在高负载场景下表现更佳。
17 4
|
5天前
|
分布式计算 并行计算 Java
Python并发风暴来袭!IO密集型与CPU密集型任务并发策略大比拼,你站哪队?
【7月更文挑战第17天】Python并发处理IO密集型(如网络请求)与CPU密集型(如数学计算)任务。IO密集型适合多线程和异步IO,如`ThreadPoolExecutor`进行网页下载;CPU密集型推荐多进程,如`multiprocessing`模块进行并行计算。选择取决于任务类型,理解任务特性是关键,以实现最佳效率。
|
4天前
|
开发框架 并行计算 .NET
脑洞大开!Python并发与异步编程的哲学思考:IO密集型与CPU密集型任务的智慧选择!
【7月更文挑战第18天】在Python中,异步编程(如`asyncio`)适合处理IO密集型任务,通过非阻塞操作提高响应性,例如使用`aiohttp`进行异步HTTP请求。而对于CPU密集型任务,由于GIL的存在,多进程(`multiprocessing`)能实现并行计算,如使用进程池进行大量计算。明智选择并发模型是性能优化的关键,体现了对任务特性和编程哲学的深刻理解。
10 2
|
4天前
|
UED 开发者 Python
Python并发编程新纪元:异步编程如何重塑IO与CPU密集型任务的处理方式?
【7月更文挑战第18天】Python异步编程提升IO任务效率,非阻塞模式减少等待时间,优化用户体验。asyncio库与await关键字助力编写非阻塞代码,示例展示异步HTTP请求。CPU密集型任务中,异步编程结合多进程可提升效率。异步编程挑战包括代码复杂性,解决策略包括使用类型提示、异步框架及最佳实践。异步编程重塑任务处理方式,成为现代Python开发的关键。
9 2
|
4天前
|
开发框架 并行计算 算法
揭秘Python并发神器:IO密集型与CPU密集型任务的异步革命,你竟还傻傻分不清?
【7月更文挑战第18天】Python并发编程中,异步IO适合IO密集型任务,如异步HTTP请求,利用`asyncio`和`aiohttp`实现并发抓取,避免等待延迟。而对于CPU密集型任务,如并行计算斐波那契数列,多进程通过`multiprocessing`库能绕过GIL限制实现并行计算。选择正确的并发模型能显著提升性能。
10 2
|
1天前
|
数据采集 算法 数据处理
Python中的并发编程:异步IO与多线程对比分析
传统的多线程编程在Python中因为全局解释器锁(GIL)的存在受到限制,导致多线程并不能充分利用多核处理器的优势。本文将探讨Python中的异步IO编程与多线程编程的差异与优劣,并分析适合的应用场景。