200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > Python学习笔记--day09 函数 模块 (文件 路径操作)

Python学习笔记--day09 函数 模块 (文件 路径操作)

时间:2024-01-11 23:03:07

相关推荐

Python学习笔记--day09 函数 模块 (文件 路径操作)

第二模块 函数&模块

第一模块主要是学习python基础知识,从第二模块开始就可以通过程序去解决工作中实际的问题。

函数,一个用于专门实现某个功能的代码块(可重用)。

内置函数

len、bin、oct、heX等

自定义函数

def send_email():# 写了10行代码,实现了发送邮件。passsend_email()

# 定义了一个函数,功能代码块def send_email():# 写了10行代码,实现了发送邮件。passgoods = [{"name": "电脑", "price": 1999},{"name": "鼠标", "price": 10},{"name": "游艇", "price": 20},{"name": "美女", "price": 998}]for index in range(len(goods)):item = goods[index]print(index + 1, item['name'], item['price'])# 调用并执行函数send_email()while True:num = input("请输入要选择的商品序号(Q/q):") # "1"if num.upper() == "Q":breakif not num.isdecimal():print("用输入的格式错误")breaknum = int(num)send_email()if num > 4 or num < 0:print("范围选择错误")breaktarget_index = num - 1choice_item = goods[target_index]print(choice_item["name"], choice_item['price'])send_email()

模块,集成了很多功能的函数集合。

内置模块,Python内部帮助我们提供好的。

import randomnum = random.randint(0,19)

import decimalv1 = decimal.Decimal("0.1")v2 = decimal.Decimal("0.2")v3 = v1 + v2print(v3) # 0.3

第三方模块,网上下载别人写好的模块(功能集合)。

自定义模块

day09 文件操作相关

文件操作文件夹和路径csv格式文件ini格式文件xml格式文件excel文件压缩文件

1. 文件操作

在学习文件操作之前,先来回顾一下编码的相关以及先关数据类型的知识。

字符串类型(str),在程序中用于表示文字信息,本质上是unicode编码中的二进制。

name = "刘小伟"

字节类型(bytes)

可表示文字信息,本质上是utf-8/gbk等编码的二进制(对unicode进行压缩,方便文件存储和网络传输。)

name = "刘小伟"data = name.encode('utf-8')print(data) # b'\xe5\x88\x98\xe5\xb0\x8f\xe4\xbc\x9f'result = data.decode('utf-8')print(result) # "刘小伟"

可表示原始二进制(图片、文件等信息)

1.1 读文件

读文本文件

# 1.打开文件#- 路径:#相对路径:'info.txt'#绝对路径:'/Users/liuxiaowei/PycharmProjects/路飞全栈/day09/files/info.txt'# - 模式# rb,表示读取文件原始的二进制(r, 读 read;b, 二进制 binary;)# 1.打开文件file_object = open('files/info.txt', mode='rb')# 2.读取文件内容,并赋值给datadata = file_object.read()# 3.关闭文件file_object.close()print(data) # b'alex-123\n\xe6\xad\xa6\xe6\xb2\x9b\xe9\xbd\x90-123'text = data.decode("utf-8")print(text)

# 1.打开文件file_object = open('files/info.txt', mode='rt', encoding='utf-8')# 2.读取文件内容,并赋值给datadata = file_object.read()# 3.关闭文件file_object.close()print(data)

读图片等非文本内容文件。

file_object = open('files/美女.png', mode='rb')data = file_object.read()file_object.close()print(data) # \x91\xf6\xf2\x83\x8aQFfv\x8b7\xcc\xed\xc3}\x7fT\x9d{.3.\xf1{\xe8\...

注意事项:

路径

相对路径,你的程序到底在哪里运行的?

绝对路径

# 1.打开文件file_object = open('/Users/liuxiaowei/PycharmProjects/路飞全栈/day09/files/info.txt', mode='rt', encoding='utf-8')# 2.读取文件内容,并赋值给datadata = file_object.read()# 3.关闭文件file_object.close()

windows系统中写绝对路径容易出问题:

# file_object = open('C:\\new\\info.txt', mode='rt', encoding='utf-8')file_object = open(r'C:\new\info.txt', mode='rt', encoding='utf-8')data = file_object.read()file_object.close()print(data)

读文件时,文件不存在程序会报错

Traceback (most recent call last):File "/Users/liuxiaowei/PycharmProjects/路飞全栈/day09/2.读文件.py", line 2, in <module>file_object = open('infower.txt', mode='rt', encoding='utf-8')FileNotFoundError: [Errno 2] No such file or directory: 'infower.txt'

# 判断路径是否存在?import osfile_path = "/Users/liuxiaowei/PycharmProjects/路飞全栈/day09/files/info.txt"exists = os.path.exists(file_path)if exists:# 1.打开文件file_object = open('files/info.txt', mode='rt', encoding='utf-8')# 2.读取文件内容,并赋值给datadata = file_object.read()# 3.关闭文件file_object.close()print(data)else:print("文件不存在")

1.2 写文件

写文本文件

# 1.打开文件# 路径:t1.txt# 模式:wb(要求写入的内容需要是字节类型)file_object = open("files/t1.txt", mode='wb')# 2.写入内容file_object.write( "刘小伟".encode("utf-8") )# 3.文件关闭file_object.close()

file_object = open("files/t1.txt", mode='wt', encoding='utf-8')file_object.write("刘小伟")file_object.close()

写图片等文件

f1 = open('files/a1.png',mode='rb')content = f1.read()f1.close()f2 = open('a2.png',mode='wb')f2.write(content)f2.close()

基础案例

# 案例1:用户注册user = input("请输入用户名:")pwd = input("请输入密码:")data = f"{usre}-{pwd}"file_object = open("files/info.txt", mode='wt', encoding='utf-8')file_object.write(data)file_object.close()"""# 案例2:多用户注册"""# w写入文件,先清空文件;再在文件中写入内容。file_object = open("files/info.txt", mode='wt', encoding='utf-8')while True:user = input("请输入用户名:")if user.upper() == "Q":breakpwd = input("请输入密码:")data = f"{user}-{pwd}\n"file_object.write(data)file_object.close()

小高级案例:(超前)

利用Python想某个网址发送请求并获取结果(利用第三方的模块)

下载第三方模块

pip install requests

/Library/Frameworks/Python.framework/Versions/3.9/bin/pip3 install requests

使用第三方模块

import requestsres = requests.get(url="网址")print(res)

# 案例1:去网上下载一点文本,文本信息写入文件。import requestsres = requests.get(url="/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=20",headers={"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"})# 网络传输的原始二进制信息(bytes)# res.contentfile_object = open('files/log1.txt', mode='wb')file_object.write(res.content)file_object.close()# 案例2:去网上下载一张图片,图片写入本地文件。import requestsres = requests.get(url="/c7e1461e4b15735fbe625c4dc85bd19904d96daf6de9fb-tosv1r_fw1200",headers={"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"})# 网络传输的原始二进制信息(bytes)# res.contentfile_object = open('files/美女.png', mode='wb')file_object.write(res.content)file_object.close()

注意事项:

路径 绝对路径相对路径 文件不存在时,w模式会新建然后再写入内容;文件存在时,w模式会清空文件再写入内容。

1.3 文件打开模式

上文我们基于文件操作基本实现了读、写的功能,其中涉及的文件操作模式:rt、rb、wt、wb,其实在文件操作中还有其他的很多模式。

========= ===============================================================Character Meaning--------- ---------------------------------------------------------------'r' open for reading (default)'w' open for writing, truncating the file first'x' create a new file and open it for writing'a' open for writing, appending to the end of the file if it exists'b' binary mode't' text mode (default)'+' open a disk file for updating (reading and writing)The default mode is 'rt' (open for reading text).

关于文件的打开模式常见应用有:

只读:rrtrb(用)

存在,读不存在,报错

只写:wwtwb(用)

存在,清空再写不存在,创建再写

只写:xxtxb

存在,报错不存在,创建再写。

只写:aatab【尾部追加】(用)

存在,尾部追加。不存在,创建再写。

读写

r+、rt+、rb+,默认光标位置:起始位置

file_object = open('files/info.txt', mode='rt+')# 读取内容data = file_object.read()print(data)# 写入内容file_object.write("你好呀")file_object.close()

file_object = open('files/info.txt', mode='rt+')# 写入内容file_object.write("alex")# 读取内容data = file_object.read()print(data) # -123file_object.close()

w+、wt+、wb+,默认光标位置:起始位置(清空文件)

# 读取内容data = file_object.read()print(data)# 写入内容file_object.write("你好呀")# 将光标位置重置起始file_object.seek(0)# 读取内容data = file_object.read()print(data)file_object.close()

x+、xt+、xb+,默认光标位置:起始位置(新文件)

a+、at+、ab+,默认光标位置:末尾

file_object = open('files/info.txt', mode='at+')# 写入内容file_object.write("武沛齐")# 将光标位置重置起始file_object.seek(0)# 读取内容data = file_object.read()print(data)file_object.close()

多用户注册案例

while True:user = input("用户名:")if user.upper() == "Q":breakpwd = input("密码:")data = "{}-{}\n".format(user, pwd)file_object = open('files/account.txt', mode='a')file_object.write(data)file_object.close()

file_object = open('files/account.txt', mode='a')while True:user = input("用户名:")if user.upper() == "Q":breakpwd = input("密码:")data = "{}-{}\n".format(user, pwd)file_object.write(data)file_object.close()

1.4 常见功能

在上述对文件的操作中,我们只使用了write和read来对文件进行读写,其实在文件操作中还有很多其他的功能来辅助实现更好的读写文件的内容。

read,读

读所有【常用】

f = open('info.txt', mode='r',encoding='utf-8')data = f.read()f.close()

f = open('info.txt', mode='rb')data = f.read()f.close()

读n个字符(字节)【会用到】

f = open('info.txt', mode='r', encoding='utf-8')# 读1个字符data = f.read(1)f.close()print(data) # 刘

f = open('info.txt', mode='r',encoding='utf-8')# 读1个字符chunk1 = f.read(1)chunk2 = f.read(2)print(chunk1,chunk2)f.close()

f = open('info.txt', mode='rb')# 读1个字节data = f.read(3)f.close()print(data, type(data)) # b'\xe6\xad\xa6' <class 'bytes'>

readline,读一行

f = open('info.txt', mode='r', encoding='utf-8')v1 = f.readline()print(v1)v2 = f.readline()print(v2)f.close()

f = open('info.txt', mode='r', encoding='utf-8')v1 = f.readline()print(v1)f.close()f = open('info.txt', mode='r', encoding='utf-8')v2 = f.readline()print(v2)f.close()

readlines,读所有行,每行作为列表的一个元素

f = open('info.txt', mode='rb')data_list = f.readlines()f.close()print(data_list)

循环,读大文件(readline加强版)【常见】

f = open('info.txt', mode='r', encoding='utf-8')for line in f:print(line.strip())f.close()

write,写

f = open('info.txt', mode='a',encoding='utf-8')f.write("刘小伟")f.close()

f = open('info.txt', mode='ab')f.write( "刘小伟".encode("utf-8") )f.close()

flush,刷到硬盘

f = open('info.txt', mode='a',encoding='utf-8')while True:# 不是写到了硬盘,而是写在缓冲区,系统会将缓冲区的内容刷到硬盘。f.write("刘小伟")f.flush()f.close()

file_object = open('files/account.txt', mode='a')while True:user = input("用户名:")if user.upper() == "Q":breakpwd = input("密码:")data = "{}-{}\n".format(user, pwd)file_object.write(data)file_object.flush()file_object.close()

移动光标位置(字节)

f = open('info.txt', mode='r+', encoding='utf-8') # r+ 读写# 移动到指定字节的位置f.seek(3)f.write("刘小伟")f.close()

注意:在a模式下,调用write在文件中写入内容时,永远只能将内容写入到尾部,不会写到光标的位置。

f = open('files/info.txt', mode = 'r+', encoding='utf-8')f.seek(2)f.write('李小龙') # 先将光标移动到最后,再写数据, 可能出现乱码, 因为"utf-8"编码3个字节一个汉字,seek(2),移动# 第一个汉字的第2个字节f.close()

获取当前光标位置

# 读字符f = open('info.txt', mode='r', encoding='utf-8')p1 = f.tell()print(p1) # 0f.read(3) # 读3个中文字符 3*3=9字节 , 如果是英文字符,那么p2是3,因为每个英文字符一个字节p2 = f.tell()print(p2) # 9f.close()

# 读字节f = open('info.txt', mode='rb')p1 = f.tell()print(p1) # 0f.read(3) # 读3个字节p2 = f.tell()print(p2) # 3f.close()

1.5 上下文管理

之前对文件进行操作时,每次都要打开和关闭文件,比较繁琐且容易忘记关闭文件。

以后再进行文件操作时,推荐大家使用with上下文管理,它可以自动实现关闭文件。

with open("xxxx.txt", mode='rb') as file_object:data = file_object.read()print(data)

在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:

with open("xxxx.txt", mode='rb') as f1, open("xxxx.txt", mode='rb') as f2:pass

练习题

补充代码:实现下载视频并保存到本地

import requestsres = requests.get(url="/newlogin?tabtype=weibo&gid=1028032222&openLoginLayer=0&url=https%3A%2F%%2F&layerid=4791081306164660",headers={"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"})# 视频的文件内容data = res.contentwith open('files/video.mp4', mode='wb') as f:f.write(data)

日志分析,计算某用户223.73.89.192访问次数。日志文件如下:access.log

49.89.167.91 - - [17/Dec/:03:43:50 +0800] "GET /wiki/detail/3/40 HTTP/1.1" 301 0 "-" "Mozilla/5.0(Linux;Android 5.1.1;OPPO A33 Build/LMY47V;wv) AppleWebKit/537.36(KHTML,link Gecko) Version/4.0 Chrome/43.0.2357.121 Mobile Safari/537.36 LieBaoFast/4.51.3" "-"49.89.167.91 - - [17/Dec/:03:44:11 +0800] "GET /wiki/detail/3/40/ HTTP/1.1" 200 8033 "-" "Mozilla/5.0(Linux;Android 5.1.1;OPPO A33 Build/LMY47V;wv) AppleWebKit/537.36(KHTML,link Gecko) Version/4.0 Chrome/43.0.2357.121 Mobile Safari/537.36 LieBaoFast/4.51.3" "-"203.208.60.66 - - [17/Dec/:03:47:58 +0800] "GET /media/uploads//11/17/pic/s1.png HTTP/1.1" 200 710728 "-" "Googlebot-Image/1.0" "-"223.73.89.192 - - [17/Dec/:03:48:26 +0800] "GET /wiki/detail/3/40/ HTTP/1.1" 200 8033 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"223.73.89.192 - - [17/Dec/:03:48:26 +0800] "GET /static/stark/plugins/font-awesome/css/font-awesome.css HTTP/1.1" 200 37414 "/wiki/detail/3/40/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"223.73.89.192 - - [17/Dec/:03:48:26 +0800] "GET /static/stark/plugins/bootstrap/css/bootstrap.css HTTP/1.1" 200 146010 "/wiki/detail/3/40/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"223.73.89.192 - - [17/Dec/:03:48:26 +0800] "GET /static/web/css/commons.css HTTP/1.1" 200 3674 "/wiki/detail/3/40/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"223.73.89.192 - - [17/Dec/:03:48:26 +0800] "GET /static/mdeditor/editormd/css/editormd.preview.css HTTP/1.1" 200 60230 "/wiki/detail/3/40/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"223.73.89.192 - - [17/Dec/:03:48:26 +0800] "GET /static/stark/js/jquery-3.3.1.min.js HTTP/1.1" 200 86927 "/wiki/detail/3/40/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"223.73.89.192 - - [17/Dec/:03:48:26 +0800] "GET /static/stark/plugins/bootstrap/js/bootstrap.min.js HTTP/1.1" 200 37045 "/wiki/detail/3/40/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"223.73.89.192 - - [17/Dec/:03:48:26 +0800] "GET /static/mdeditor/editormd/lib/marked.min.js HTTP/1.1" 200 19608 "/wiki/detail/3/40/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"223.73.89.192 - - [17/Dec/:03:48:27 +0800] "GET /static/mdeditor/editormd/lib/prettify.min.js HTTP/1.1" 200 17973 "/wiki/detail/3/40/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"223.73.89.192 - - [17/Dec/:03:48:27 +0800] "GET /static/mdeditor/editormd/fonts/fontawesome-webfont.woff2?v=4.3.0 HTTP/1.1" 200 56780 "/static/mdeditor/editormd/css/editormd.preview.css" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"223.73.89.192 - - [17/Dec/:03:48:27 +0800] "GET /static/mdeditor/editormd/editormd.js HTTP/1.1" 200 163262 "/wiki/detail/3/40/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"223.73.89.192 - - [17/Dec/:03:48:28 +0800] "GET /static/mdeditor/mdeditor-preview-init.js HTTP/1.1" 200 261 "/wiki/detail/3/40/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"223.73.89.192 - - [17/Dec/:03:48:29 +0800] "GET /static/stark/plugins/font-awesome/fonts/fontawesome-webfont.woff2?v=4.7.0 HTTP/1.1" 200 77160 "/static/stark/plugins/font-awesome/css/font-awesome.css" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"223.73.89.192 - - [17/Dec/:03:48:29 +0800] "GET /media/uploads//02/22/Gobook/_book/ssl2.png HTTP/1.1" 200 203535 "/wiki/detail/3/40/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"

count = 0with open('files/access.log', mode='r', encoding='utf-8') as f:for line in f: # 循环读取逐行数据data = line.strip()if not line.startswith('223.73.89.192'):continuecount += 1print(f"{'223.73.89.192'}访问次数{count}")

日志分析升级,计算所有用户的访问次数。

user = {}with open('files/access.log', mode='r', encoding='utf-8') as f:for line in f:user_ip = line.split(' ')[0]if user_ip in user:user[user_ip] += 1else:user[user_ip] = 1for key, value in user.items():print(f'{key}访问次数{value}')

筛选出股票 当前价大于 20 的所有股票数据。

股票代码,股票名称,当前价,涨跌额,涨跌幅,年初至今,成交量,成交额,换手率,市盈率(TTM),股息率,市值SH601778,N晶科,6.29,+1.92,+43.94%,+43.94%,259.66万,1625.52万,0.44%,22.32,-,173.95亿SH688566,吉贝尔,52.66,+6.96,+15.23%,+122.29%,1626.58万,8.09亿,42.29%,89.34,-,98.44亿SH688268,华特气体,88.80,+11.72,+15.20%,+102.51%,622.60万,5.13亿,22.87%,150.47,-,106.56亿SH600734,实达集团,2.60,+0.24,+10.17%,-61.71%,1340.27万,3391.14万,2.58%,亏损,0.00%,16.18亿SH900957,凌云B股,0.36,+0.033,+10.09%,-35.25%,119.15万,42.10万,0.65%,44.65,0.00%,1.26亿SZ000584,哈工智能,6.01,+0.55,+10.07%,-4.15%,2610.86万,1.53亿,4.36%,199.33,0.26%,36.86亿SH600599,熊猫金控,6.78,+0.62,+10.06%,-35.55%,599.64万,3900.23万,3.61%,亏损,0.00%,11.25亿SH600520,文一科技,8.21,+0.75,+10.05%,-24.05%,552.34万,4464.69万,3.49%,亏损,0.00%,13.01亿SH603682,锦和商业,11.73,+1.07,+10.04%,+48.29%,2746.63万,3.15亿,29.06%,29.62,-,55.42亿SZ300831,派瑞股份,12.27,+1.12,+10.04%,+208.29%,25.38万,311.41万,0.32%,60.59,-,39.26亿

with open('files/stock.txt', mode='r') as f:for line in f:if line.startswith('股票代码'):continueprice = line.split(',')[2]if float(price) > 20:print(line.strip())

with open('files/stock.txt', mode='r') as f:f.readline() # 跳过第一行,因为readline()读完,光标落在最后for line in f:price = line.split(',')[2]if float(price) > 20:print(line.strip())

根据要求修改文件的内容,原文件内容如下:ha.conf

global log 127.0.0.1 local2daemonmaxconn 256log 127.0.0.1 local2 infodefaultslog globalmode httptimeout connect 5000mstimeout client 50000mstimeout server 50000msoption dontlognulllisten stats :8888stats enablestats uri /adminstats authadmin:1234frontend bind 0.0.0.0:80option httplogoption httpcloseoption forwardforlog globalacl www hdr_reg(host) -i use_backend if wwwbackend server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000...

请将文件中的luffycity修改为pythonav

# 文件读到内存,再通过replace(适合小文件,不适用大文件)# 挨个位置读文件读内容,遇到luffcity将其替换为pythonav(不可取)# 同时打开两个文件,一个读,一个写(适合大小文件)with open('files/ha.conf', mode='r+') as f:for line in f:f.write(line.replace('luffcity', 'pythonav'))

with open('files/ha.conf', mode='r', encoding='utf-8') as file_read, open('files/new_ha.conf', mode='w', encoding='utf-8') as file_write:for line in file_read:new_list = line.replace('luffycity', 'pythonav')file_write.write(new_list)# 重命名import shutilshutil.move('files/new_ha.conf', 'files/ha.conf')

2. csv格式文件

逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。

对于这种格式的数据,我们需要利用open函数来读取文件并根据逗号分隔的特点来进行处理。

股票代码,股票名称,当前价,涨跌额,涨跌幅,年初至今SH601778,N晶科,6.29,+1.92,-43.94%,+43.94%SH688566,吉贝尔,52.66,+6.96,+15.23%,+122.29%...

练习题案例:下载文档中的所有图片且以用户名为图片名称存储。

ID,用户名,头像26044585,Hush,/51d46dc32abe7ac7f83b94c67bb88cacc46869954f478-aP4Q3V19318369,柒十一,/703fdb063bdc37b11033ef794f9b3a7adfa01fd21a6d1-wTFbnO15529690,Law344,/b438d8c61ed2abf50ca94e00f257ca7a223e3b364b471-xrzoQd18311394,Jennah·,/4edba1ed6a71797f52355aa1de5af961b85bf824cb71-px1nZz18009711,可洛爱画画,/03331ef39b5c7687f5cc47dbcbafd974403c962ae88ce-Co8AUI30574436,花姑凉~,/2f5b657edb9497ff8c41132e18000edb082d158c2404-8rYHbw17740339,小巫師,/dbc6fd49f1915545cc42c1a1492a418dbaebd2c21bb9-9aDqgl18741964,桐末tonmo,/b60cee303f62aaa592292f45a1ed8d5be9873b2ed5c-gAJehO30535005,TANGZHIQI,/bbd08ee168d54665bf9b07899a5c4a4d6bc1eb8af77a4-8Gz3K131078743,你的老杨,/c46fbc3c9a01db37b8e786cbd7174bbd475e4cda220f4-F1u7MX25519376,尺尺寸,/ee29ee198efb98f970e3dc2b24c40d89bfb6f911126b6-KGvKes21113978,C-CLong,/7fa6b2a0d570e67246b34840a87d57c16a875dba9100-SXsSeY24674102,szaa,/0716687b0df93e8c3a8e0925b6d2e4135449cd27597c4-gWdv2430508507,爱起床的小灰灰,/4eafdbfa21b2f300a7becd8863f948e5e92ef789b5a5-1ozTKq12593664,yokozen,/cd07bbaf052b752ed5c287602404ea719d7dd8161321b-cJtHss16899164,一阵疯,/0940b557b28892658c3bcaf52f5ba8dc8402100e130b2-G966Uz847937,卩丬My㊊伴er彎,/e2d6bb5bc8498c6f607492a8f96164aa2366b104e7a-kWaH6831010628,慢慢即漫漫,/c4fb6718907a22f202e8dd14d52f0c369685e59cfea7-82FdsK13438168,海贼玩跑跑,/1edae3ce6fe0f6e95b67b4f8b57c4cebf19c501b397e-BXwiW628593155,源稚生,/626cfd89ca4c10e6f875f3dfe1005331e4c0fd7fd429-9SeJeQ2821,合伙哼哼,/f59d4780531aa1892b80e0ec94d4ec78dcba08ff18c416-769X6a28255146,漫步AAA,/3c034c520594e38353a039d7e7a5fd5e74fb53eb1086-KnpLaL30537613,配䦹,/efd81d22c1b1a2de77a0e0d8e853282b83b6bbc590fd-y3d4GJ22665880,日后必火,/69f0f959979a4fada9e9e55f565989544be88164d2b-INWbaF16748980,keer521521,/654953460733026a7ef6e101404055627ad51784a95c-B6OFs430536510,“西辞”,/61cfffca6b2507bf51a507e8319d68a8b8c3a96968f-6IvMSk30986577,艺成背锅王,/c381ecc43d6c69758a86a30ebf72976906ae6c53291f9-9zroHF26409800,CsysADk7,/bf1d22092c2070d68ade012c588f2e410caaab1f58051-ahlgLm30469116,18啊全阿,/654953460733026a7ef6e101404055627ad51784a95c-B6OFs415514336,W/小哥,/a30f5967fc0acf81421dd49650397de63c105b9ead1c-nVRrNl17473505,椿の花,/0e38d810e5a24f91ebb251fd3aaaed8bb37655b14844c-pgNJBP19165177,っ思忆゜♪,/4815ea0e4905d0f3bb82a654b481811dadbfe5ce2673-vMVr0B16059616,格林熊丶,/8760a2b08d87e6ed4b7a9715b1a668176dbf84fec5b-jx14tZ30734152,sCWVkJDG,/f31a5305d1b8717bbfb897723f267d316e58e7b7dc40-GD3e2224019677,虚无本心,/6fdfa9834abe362e978b517275b06e7f0d5926aa650-N1xCXE16670283,Y-雨后天空,/a3bbb0045b536fc27a6d2effa64a0d43f9f5193c177f-I2vHaI21512483,汤姆2,/98cc50a61a7cc9b49a8af754ffb26bd15764a82f1133-AkiU7D16441049,笑潇啸逍小鱼,/ae8a70cd85aff3a8587ff6578d5cf7620f3691df13e46-lmrIi924795603,⁢⁢⁢⁢⁢v,/a7183cc3a933aa129d7b3230bf1378fd8f5857846cc5-3tDtx329819152,妮玛士珍多,/ca4ecb573bf1ff0415c7a873d64470dedc465ea1213c6-RAkArS19101282,陈勇敢❤,/ab6d04ebaff3176e3570139a65155856871241b58bc6-Qklj2E28337572,爱意随风散,/117ad8b6eeda57a562ac6ab2861111a793ca3d1d5543-SjWlk217342758,幸运instant,/72b5f9042ec297ae57b83431123bc1c066cca90fa23-3MoJNj18483372,Beau染,/077115cb622b1ff3907ec6932e1b575393d5aae720487-d1cdT922127102,栽花的小蜻蜓,/6c3cbf9f27e17898083186fc51985e43269018cc1e1df-QfOIBG13802024,LoveHsu,/f720a15f8b49b86a7c1ee4951263a8dbecfe3e43d2d-GPEauV22558931,白驹过隙丶梨花泪う,/e49e1341dfe5144da5c71bd15f1052ef07ba7a0e1296b-jfyfDJ11762339,cojoy,/5b27f876d5d391e7c4889bc5e8ba214419eb72b56822-83gYmB30711623,雪碧学长呀,/2c288a1535048b05537ba523b3fc9eacc1e81273212d1-nr8M4t18906718,西霸王,/7b02ad5e01bd8c0a29817e362814666a7800831c154a6-AvBDaG31037856,邵阳的小哥哥,/654953460733026a7ef6e101404055627ad51784a95c-B6OFs426830711,稳健谭,/51547ade3f0aef134e8d268cfd4ad61110925aefec8a-NKPEYX

import requestsimport oswith open('files/mv.csv', mode='r', encoding='utf-8') as file_read:file_read.readline() # 跳过第一行for line in file_read:content = line.split(',')file_name = content[1]file_url = content[2].strip()res = requests.get(url=file_url,headers={"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"})if not os.path.exists('images'):os.mkdir('images')with open(f'images/{file_name}.png', mode='wb') as fw:fw.write(res.content)

3. ini格式文件

ini文件是Initialization File的缩写,平时用于存储软件的的配置文件。例如:MySQL数据库的配置文件

[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.socklog-bin=py-mysql-bincharacter-set-server=utf8collation-server=utf8_general_cilog-error=/var/log/mysqld.log# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0[mysqld_safe]log-error=/var/log/mariadb/mariadb.logpid-file=/var/run/mariadb/mariadb.pid[client]default-character-set=utf8

这种格式是可以直接使用open来出来,考虑到自己处理比较麻烦,所以Python为我们提供了更为方便的方式。

读取所有节点

import configparserconfig = configparser.ConfigParser()config.read('files/my.ini', encoding='utf-8')# 获取所有的节点result = config.sections()print(result)>>> 输出['mysqld', 'mysqld_safe', 'client']

读取节点下的键值

import configparserconfig = configparser.ConfigParser()config.read('files/my.ini', encoding='utf-8')# 获取所有的节点result = config.sections()text = config.items(result[1])for data in text:print('='.join(list(data)))for key, value in text: # 因为text列表里的元素是元组,所以key, value 对应print(key, value)

读取节点下值(根据 节点+键 )

result = config.get('mysqld', 'collation-server') # 'mysqld' -> 节点,'collation-server' -> 键print(result)

检查、删除、添加节点

# 添加一个节点config.add_section('group')config.write(open('files/my.ini', mode='w', encoding='utf-8')) # 写入到文件对象# 添加节点下面到键值if not config.has_section('group'):config.add_section('group')config.set('group', 'name', 'liuxiaowei')config.set('client','name', 'liuxiaowei')config.write(open('files/my.ini', mode='w', encoding='utf-8')) # 写入到文件对象# 删除节点if config.has_section('group'):config.remove_section('group')config.write(open('files/my.ini', mode='w', encoding='utf-8'))# 删除节点下面的内容if config.has_section('client'):config.remove_section('client')config.remove_option('mysqld', 'datadir')config.write(open('files/my.ini', mode='w', encoding='utf-8'))

4. XML格式文件

可扩展标记语言,是一种简单的数据存储语言,XML 被设计用来传输和存储数据。

存储,可用来存放配置文件,例如:java的配置文件。传输,网络传输时以这种格式存在,例如:早期ajax传输的数据、soap协议等。

<data><country name="Liechtenstein"><rank updated="yes">2</rank><year></year><gdppc>141100</gdppc><neighbor direction="E" name="Austria" /><neighbor direction="W" name="Switzerland" /></country><country name="Singapore"><rank updated="yes">5</rank><year>2026</year><gdppc>59900</gdppc><neighbor direction="N" name="Malaysia" /></country><country name="Panama"><rank updated="yes">69</rank><year>2026</year><gdppc>13600</gdppc><neighbor direction="W" name="Costa Rica" /><neighbor direction="E" name="Colombia" /></country></data>

微信官方文档:公众号

4.1 读取文件和内容

from xml.etree import ElementTree as ET# ET去打开xml文件tree = ET.parse("files/xo.xml")# 获取根标签root = tree.getroot()print(root) # <Element 'data' at 0x7f94e02763b0>

from xml.etree import ElementTree as ETcontent = """<data><country name="Liechtenstein"><rank updated="yes">2</rank><year></year><gdppc>141100</gdppc><neighbor direction="E" name="Austria" /><neighbor direction="W" name="Switzerland" /></country><country name="Panama"><rank updated="yes">69</rank><year>2026</year><gdppc>13600</gdppc><neighbor direction="W" name="Costa Rica" /><neighbor direction="E" name="Colombia" /></country></data>"""root = ET.XML(content) # xml以字符串形式存在的时候print(root) # <Element 'data' at 0x7fdaa019cea0>

4.2 读取节点数据

from xml.etree import ElementTree as ETcontent = """<data><country name="Liechtenstein" id="999" ><rank>2</rank><year></year><gdppc>141100</gdppc><neighbor direction="E" name="Austria" /><neighbor direction="W" name="Switzerland" /></country><country name="Panama"><rank>69</rank><year>2026</year><gdppc>13600</gdppc><neighbor direction="W" name="Costa Rica" /><neighbor direction="E" name="Colombia" /></country></data>"""root = ET.XML(content)for child in root:print(child.tag, child.attrib)for node in child:print(node.tag, node.attrib, node.text)

from xml.etree import ElementTree as ETcontent = """<data><country name="Liechtenstein" id="999" ><rank>2</rank><year></year><gdppc>141100</gdppc><neighbor direction="E" name="Austria" /><neighbor direction="W" name="Switzerland" /></country><country name="Panama"><rank>69</rank><year>2026</year><gdppc>13600</gdppc><neighbor direction="W" name="Costa Rica" /><neighbor direction="E" name="Colombia" /></country></data>"""root = ET.XML(content)for child in root.iter('year'): # 去data标签子子孙孙里找所有的year标签print(child.tag, child.text)

from xml.etree import ElementTree as ETcontent = """<data><country name="Liechtenstein" id="999" ><rank>2</rank><year></year><gdppc>141100</gdppc><neighbor direction="E" name="Austria" /><neighbor direction="W" name="Switzerland" /></country><country name="Panama"><rank>69</rank><year>2026</year><gdppc>13600</gdppc><neighbor direction="W" name="Costa Rica" /><neighbor direction="E" name="Colombia" /></country></data>"""# 获取根标签 dataroot = ET.XML(content)v1 = root.findall('country')print(v1) # [<Element 'country' at 0x7fbdd2df7cc0>, <Element 'country' at 0x7fbdd2df7ea0>, <Element 'country' at 0x7fbdd2dfa090>]# 获取指定标签的内容v1 = root.findall('country')for rank in v1:print(rank.find('rank').text)v2 = root.find('country').find('rank')print(v2.text)

from xml.etree import ElementTree as ETcontent = """<data><country name="Liechtenstein" id="999" ><rank>2</rank><year></year><gdppc>141100</gdppc><neighbor direction="E" name="Austria" /><neighbor direction="W" name="Switzerland" /></country><country name="Panama"><rank>69</rank><year>2026</year><gdppc>13600</gdppc><neighbor direction="W" name="Costa Rica" /><neighbor direction="E" name="Colombia" /></country></data>"""# 获取根标签 dataroot = ET.XML(content)country_object = root.find("country")print(country_object.tag, country_object.attrib)gdppc_object = country_object.find("gdppc")print(gdppc_object.tag,gdppc_object.attrib,gdppc_object.text)

4.3 修改和删除节点

from xml.etree import ElementTree as ETcontent = """<data><country name="Liechtenstein"><rank>2</rank><year></year><gdppc>141100</gdppc><neighbor direction="E" name="Austria" /><neighbor direction="W" name="Switzerland" /></country><country name="Panama"><rank>69</rank><year>2026</year><gdppc>13600</gdppc><neighbor direction="W" name="Costa Rica" /><neighbor direction="E" name="Colombia" /></country></data>"""root = ET.XML(content)# 修改节点内容和属性rank = root.find('country').find('rank')print(rank.text)rank.text = "999" # 修改内容rank.set('updated', '-07-14') # 设置一个属性print(rank.text, rank.attrib)############ 保存文件 ############tree = ET.ElementTree(root)tree.write("files/new.xml", encoding='utf-8')# 删除节点root.remove( root.find('country') )print(root.findall('country'))############ 保存文件 ############tree = ET.ElementTree(root)tree.write("files/new.xml", encoding='utf-8')

4.4 构建文档

<home><son name="儿1"><grandson name="儿11"></grandson><grandson name="儿12"></grandson></son><son name="儿2"></son></home>

from xml.etree import ElementTree as ET# 创建根节点root = ET.Element('home')# 创建节点大儿子son1 = ET.Element('son', {'name': '儿1'})# 创建节点小儿子son2 = ET.Element('son', {'name': '儿2'})# 在大儿子中创建两个孙子grandson1 = ET.Element('grandson', {'name': '儿11'})grandson2 = ET.Element('grandson', {'name': '儿12'})son1.append(grandson1)son1.append(grandson2)# 把儿子添加到根节点中root.append(son1)root.append(son2)tree = ET.ElementTree(root)tree.write('file/oooo.xml', encoding='utf-8', short_empty_elements=False) # 是否用短标签

<famliy><son name="儿1"><grandson name="儿11"></grandson><grandson name="儿12"></grandson></son><son name="儿2"></son></famliy>

from xml.element import ElementTree as ET# 创建根节点root = ET.Element('family')# 创建大儿子son1 = root.makeelement('son', {'name': '儿1'})# 创建小儿子son2 = root.makeelement('son', {'name': '儿2'})# 在大儿子中创建两个孙子grandson1 = son1.makeelement('grandson', {'name': '儿11'})grandson2 = son1.makeelemnt('grandson', {'name': '儿12'})son1.append(grandson1)son1.append(grandson2)# 把儿子添加到根节点中root.append(son1)root.append(son2)tree = ET.ElementTree(root)tree.write('files/oooo.xml', encoding='utf-8')

<famliy><son name="儿1"><age name="儿11">孙子</age></son><son name="儿2"></son></famliy>

from xml.etree import ElementTree as ET# 创建根节点root = ET.Element("famliy")# 创建节点大儿子son1 = ET.SubElement(root, "son", attrib={'name': '儿1'})# 创建小儿子son2 = ET.SubElement(root, "son", attrib={"name": "儿2"})# 在大儿子中创建一个孙子grandson1 = ET.SubElement(son1, "age", attrib={'name': '儿11'})grandson1.text = '孙子'et = ET.ElementTree(root) #生成文档对象et.write("test.xml", encoding="utf-8")

<user><![CDATA[你好呀]]</user>

from xml.etree import ElementTree as ET# 创建根节点root = ET.Element("user")root.text = "<![CDATA[你好呀]]"et = ET.ElementTree(root) # 生成文档对象et.write("test.xml", encoding="utf-8")

案例:

content = """<xml><ToUserName><![CDATA[gh_7f083739789a]]></ToUserName><FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]></FromUserName><CreateTime>1395658920</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event><MsgID>200163836</MsgID><Status><![CDATA[success]]></Status></xml>"""from xml.etree import ElementTree as ETinfo = {}root = ET.XML(content)for node in root:# print(node.tag,node.text)info[node.tag] = node.textprint(info)

5. Excel格式文件

Python内部未提供处理Excel文件的功能,想要在Python中操作Excel需要按照第三方的模块。

pip install openpyxl

此模块中集成了Python操作Excel的相关功能,接下来我们就需要去学习该模块提供的相关功能即可。

5.1 读Excel

读sheet

from openpyxl import load_workbookwb = load_workbook("files/p1.xlsx")# sheet相关操作# 1.获取excel文件中的所有sheet名称"""print(wb.sheetnames) # ['数据导出', '用户列表', 'Sheet1', 'Sheet2']"""# 2.选择sheet,基于sheet名称"""sheet = wb["数据导出"]cell = sheet.cell(1, 2)print(cell.value)"""# 3.选择sheet,基于索引位置"""sheet = wb.worksheets[0]cell = sheet.cell(1,2)print(cell.value)"""# 4.循环所有的sheet"""for name in wb.sheetnames:sheet = wb[name]cell = sheet.cell(1, 1)print(cell.value)""""""for sheet in wb.worksheets:cell = sheet.cell(1, 1)print(cell.value)""""""for sheet in wb:cell = sheet.cell(1, 1)print(cell.value)"""

读sheet中单元格的数据

from openpyxl import load_workbookwb = load_workbook("files/p1.xlsx")sheet = wb.worksheets[0]# 1.获取第N行第N列的单元格(位置是从1开始)"""cell = sheet.cell(1, 1)print(cell.value)print(cell.style)print(cell.font)print(cell.alignment)"""# 2.获取某个单元格"""c1 = sheet["A2"]print(c1.value)c2 = sheet['D4']print(c2.value)"""# 3.第N行所有的单元格"""for cell in sheet[1]:print(cell.value)"""# 4.所有行的数据(获取某一列数据)"""for row in sheet.rows:print(row[0].value, row[1].value)"""# 5.获取所有列的数据"""for col in sheet.columns:print(col[1].value)"""

读合并的单元格

from openpyxl import load_workbookwb = load_workbook('files/p1.xlsx')sheet = wb.worksheets[2]# 获取第N行第N列第单元格(位置从1开始)c1 = sheet.cell(1, 1)print(c1) # <Cell 'Sheet1'.A1>print(c1.value) # 用户信息c2 = sheet.cell(1, 2)print(c2) # <MergedCell 'Sheet1'.B1>print(c2.value) # None

from openpyxl import load_workbookwb = load_workbook('files/p1.xlsx')sheet = wb.sheets[2]for row in sheet.rows:print(row)>>>(<Cell 'Sheet1'.A1>, <MergedCell 'Sheet1'.B1>, <Cell 'Sheet1'.C1>)(<Cell 'Sheet1'.A2>, <Cell 'Sheet1'.B2>, <Cell 'Sheet1'.C2>)(<Cell 'Sheet1'.A3>, <Cell 'Sheet1'.B3>, <Cell 'Sheet1'.C3>)(<MergedCell 'Sheet1'.A4>, <Cell 'Sheet1'.B4>, <Cell 'Sheet1'.C4>)(<Cell 'Sheet1'.A5>, <Cell 'Sheet1'.B5>, <Cell 'Sheet1'.C5>)

5.1 写Excel

在Excel中想要写文件,大致要分为在:

原Excel文件基础上写内容。

from openpyxl import load_workbookwb = load_workbook('files/p1.xlsx')sheet = wb.worksheets[0]# 找到单元格,并修改单元格的内容cell = sheet.cell(1, 1)cell.value = "新的开始"# 将excel文件保存到p2.xlsx文件中wb.save("files/p2.xlsx")

新创建Excel文件写内容。

from openpyxl import workbook# 创建excel且默认会创建一个sheet(名称为Sheet)wb = workbook.Workbook()sheet = wb.worksheets[0] # 或 sheet = wb["Sheet"]# 找到单元格,并修改单元格的内容cell = sheet.cell(1, 1)cell.value = "新的开始"# 将excel文件保存到p2.xlsx文件中wb.save("files/p2.xlsx")

在了解了如何读取Excel和创建Excel之后,后续对于Excel中的sheet和cell操作基本上都相同。

from openpyxl import workbookwb = workbook.Workbook() # Sheet# 1. 修改sheet名称"""sheet = wb.worksheets[0]sheet.title = "数据集"wb.save("p2.xlsx")"""# 2. 创建sheet并设置sheet颜色"""sheet = wb.create_sheet("工作计划", 0)sheet.sheet_properties.tabColor = "1072BA"wb.save("p2.xlsx")"""# 3. 默认打开的sheet"""wb.active = 0wb.save("p2.xlsx")"""# 4. 拷贝sheet"""sheet = wb.create_sheet("工作计划")sheet.sheet_properties.tabColor = "1072BA"new_sheet = wb.copy_worksheet(wb["Sheet"])new_sheet.title = "新的计划"wb.save("p2.xlsx")"""# 5.删除sheet"""del wb["用户列表"]wb.save('files/p2.xlsx')"""

from openpyxl import load_workbookfrom openpyxl.styles import Alignment, Border, Side, Font, PatternFill, GradientFillwb = load_workbook('files/p1.xlsx')sheet = wb.worksheets[1]# 1. 获取某个单元格,修改值"""cell = sheet.cell(1, 1)cell.value = "开始"wb.save("p2.xlsx")"""# 2. 获取某个单元格,修改值"""sheet["B3"] = "Alex"wb.save("p2.xlsx")"""# 3. 获取某些单元格,修改值"""cell_list = sheet["B2":"C3"]for row in cell_list:for cell in row:cell.value = "新的值"wb.save("p2.xlsx")"""# 4. 对齐方式"""cell = sheet.cell(1, 1)# horizontal,水平方向对齐方式:"general", "left", "center", "right", "fill", "justify", "centerContinuous", "distributed"# vertical,垂直方向对齐方式:"top", "center", "bottom", "justify", "distributed"# text_rotation,旋转角度。# wrap_text,是否自动换行。cell.alignment = Alignment(horizontal='center', vertical='distributed', text_rotation=45, wrap_text=True)wb.save("p2.xlsx")"""# 5. 边框# side的style有如下:dashDot','dashDotDot', 'dashed','dotted','double','hair', 'medium', 'mediumDashDot', 'mediumDashDotDot','mediumDashed', 'slantDashDot', 'thick', 'thin'"""cell = sheet.cell(9, 2)cell.border = Border(top=Side(style="thin", color="FFB6C1"), bottom=Side(style="dashed", color="FFB6C1"),left=Side(style="dashed", color="FFB6C1"),right=Side(style="dashed", color="9932CC"),diagonal=Side(style="thin", color="483D8B"), # 对角线diagonalUp=True, # 左下 ~ 右上diagonalDown=True # 左上 ~ 右下)wb.save("p2.xlsx")"""# 6.字体"""cell = sheet.cell(5, 4)cell.font = Font(name="微软雅黑", size=45, color="ff0000", underline="single")wb.save("p2.xlsx")"""# 7.背景色"""cell = sheet.cell(5, 3)cell.fill = PatternFill("solid", fgColor="99ccff")wb.save("p2.xlsx")"""# 8.渐变背景色"""cell = sheet.cell(5, 5)cell.fill = GradientFill("linear", stop=("FFFFFF", "99ccff", "000000"))wb.save("p2.xlsx")"""# 9.宽高(索引从1开始)"""sheet.row_dimensions[1].height = 50sheet.column_dimensions["E"].width = 100wb.save("p2.xlsx")"""# 10.合并单元格"""sheet.merge_cells("B2:D8")sheet.merge_cells(start_row=15, start_column=3, end_row=18, end_column=8)wb.save("p2.xlsx")""""""sheet.unmerge_cells("B2:D8")wb.save("p2.xlsx")"""# 11.写入公式"""sheet = wb.worksheets[3]sheet["D1"] = "合计"sheet["D2"] = "=B2*C2"wb.save("p2.xlsx")""""""sheet = wb.worksheets[3]sheet["D3"] = "=SUM(B3,C3)"wb.save("p2.xlsx")"""# 12.删除"""# idx,要删除的索引位置# amount,从索引位置开始要删除的个数(默认为1)sheet.delete_rows(idx=1, amount=20)sheet.delete_cols(idx=1, amount=3)wb.save("p2.xlsx")"""# 13.插入"""sheet.insert_rows(idx=5, amount=10)sheet.insert_cols(idx=3, amount=2)wb.save("p2.xlsx")"""# 14.循环写内容"""sheet = wb["Sheet"]cell_range = sheet['A1:C2']for row in cell_range:for cell in row:cell.value = "xx"for row in sheet.iter_rows(min_row=5, min_col=1, max_col=7, max_row=10):for cell in row:cell.value = "oo"wb.save("p2.xlsx")"""# 15.移动"""# 将H2:J10范围的数据,向右移动15个位置、向上移动1个位置sheet.move_range("H2:J10",rows=1, cols=15)wb.save("p2.xlsx")""""""sheet = wb.worksheets[3]sheet["D1"] = "合计"sheet["D2"] = "=B2*C2"sheet["D3"] = "=SUM(B3,C3)"sheet.move_range("B1:D3",cols=10, translate=True) # 自动翻译公式wb.save("p2.xlsx")"""# 16.打印区域"""sheet.print_area = "A1:D200"wb.save("p2.xlsx")"""# 17.打印时,每个页面的固定表头"""sheet.print_title_cols = "A:D"sheet.print_title_rows = "1:3"wb.save("p2.xlsx")"""

6. 压缩文件

基于Python内置的shutil模块可以实现对压缩文件的操作。

import shutil# 1. 压缩文件"""# base_name,压缩后的压缩包文件# format,压缩的格式,例如:"zip", "tar", "gztar", "bztar", or "xztar".# root_dir,要压缩的文件夹路径"""# shutil.make_archive(base_name=r'datafile',format='zip',root_dir=r'files')# 2. 解压文件"""# filename,要解压的压缩包文件# extract_dir,解压的路径# format,压缩文件格式"""# shutil.unpack_archive(filename=r'datafile.zip', extract_dir=r'xxxxxx/xo', format='zip')

7. 路径相关

7.1 转义

windows路径使用的是反斜杠\,linux路径使用的是斜杠/

特别的,在windows系统中如果有这样的一个路径D:\nxxx\txxx\x1,程序会报错。因为在路径中存在特殊符\n(换行符)和\t(制表符),Python解释器无法自动区分。

所以,在windows中编写路径时,一般有两种方式:

加转义符,例如:"D:\\nxxx\\txxx\\x1"路径前加r,例如:r"D:\\nxxx\\txxx\\x1"

7.2 程序当前路径

项目中如果使用了相对路径,那么一定要注意当前所在的位置。

例如:在/Users/liuxiaowei/PycharmProjects/CodeRepository/路径下编写demo.py文件

with open("a1.txt", mode='w', encoding='utf-8') as f:f.write("你好呀")

用以下两种方式去运行:

方式1,文件会创建在/Users/liuxiaowei/PycharmProjects/CodeRepository/目录下。

cd /Users/liuxiaowei/PycharmProjects/CodeRepository/python demo.py

方式2,文件会创建在/Users/wupeiqi目录下。

cd /Users/liuxiaoweipython /Users/wupeiqi/PycharmProjects/CodeRepository/demo.py

import os"""# 1.获取当前运行的py脚本所在路径abs = os.path.abspath(__file__)print(abs) # /Users/wupeiqi/PycharmProjects/luffyCourse/day09/20.路径相关.pypath = os.path.dirname(abs)print(path) # /Users/wupeiqi/PycharmProjects/luffyCourse/day09"""base_dir = os.path.dirname(os.path.abspath(__file__))file_path = os.path.join(base_dir, 'files', 'info.txt')print(file_path)if os.path.exists(file_path):file_object = open(file_path, mode='r', encoding='utf-8')data = file_object.read()file_object.close()print(data)else:print('文件路径不存在')

7.3 文件和路径相关

import shutilimport os# 1. 获取当前脚本绝对路径"""abs_path = os.path.abspath(__file__)print(abs_path)"""# 2. 获取当前文件的上级目录"""base_path = os.path.dirname( os.path.dirname(路径) )print(base_path)"""# 3. 路径拼接"""p1 = os.path.join(base_path, 'xx')print(p1)p2 = os.path.join(base_path, 'xx', 'oo', 'a1.png')print(p2)"""# 4. 判断路径是否存在"""exists = os.path.exists(p1)print(exists)"""# 5. 创建文件夹"""os.makedirs(路径)""""""path = os.path.join(base_path, 'xx', 'oo', 'uuuu')if not os.path.exists(path):os.makedirs(path)"""# 6. 是否是文件夹"""file_path = os.path.join(base_path, 'xx', 'oo', 'uuuu.png')is_dir = os.path.isdir(file_path)print(is_dir) # Falsefolder_path = os.path.join(base_path, 'xx', 'oo', 'uuuu')is_dir = os.path.isdir(folder_path)print(is_dir) # True"""# 7. 删除文件或文件夹"""os.remove("文件路径")""""""path = os.path.join(base_path, 'xx')shutil.rmtree(path)"""# 8. 拷贝文件夹"""shutil.copytree("/Users/liuxiaowei/Desktop/图/csdn/","/Users/liuxiaowei/PycharmProjects/CodeRepository/files")"""# 9.拷贝文件"""shutil.copy("/Users/liuxiaowei/Desktop/图/csdn/WX-112406@2x.png","/Users/liuxiaowei/PycharmProjects/CodeRepository/")shutil.copy("/Users/liuxiaowei/Desktop/图/csdn/WX-112406@2x.png","/Users/liuxiaowei/PycharmProjects/CodeRepository/x.png")"""# 10.文件或文件夹重命名"""shutil.move("/Users/liuxiaowei/PycharmProjects/CodeRepository/x.png","/Users/liuxiaowei/PycharmProjects/CodeRepository/xxxx.png")shutil.move("/Users/liuxioawei/PycharmProjects/CodeRepository/files","/Users/liuxiaowei/PycharmProjects/CodeRepository/images")"""

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。