说到python中怎么打开,你脑子里第一个蹦出来的,是不是那个孤零零的 f = open(...)
?要是这样,那哥们儿,你可得坐稳了,今天我得好好给你说道说道。这玩意儿,远不止你想的那么简单,里头的门道,深着呢。
咱们先从最常见,也是最多人掉坑里的——打开文件——开始聊。
你是不是这么写的?
python
f = open('我的日记.txt', 'r')
content = f.read()
print(content)
f.close()
我告诉你,这写法,在现在看来,简直就是“上古遗风”。不是说它错,但它太容易出事了!最大的隐患就是,你可能忘了最后那句 f.close()
。或者,在 read
的时候程序要是报了个错,直接崩了,那 f.close()
就永远没机会执行了。结果呢?这个文件句柄就被你的程序一直占着,像个不肯走的幽灵,占着茅坑不拉屎。系统资源就这么一点点被你耗干了。
所以,现在,求求了,请你把这种写法从脑子里彻底删除!然后刻上这五个字:with open
。
这才是现代Pythonista(程序员)打开文件的唯一正确姿势,没有之一!
“`python
with open(‘我的宝贝数据.csv’, ‘r’, encoding=’utf-8′) as f:
data = f.read()
# 在这个代码块里,你想怎么折腾f都行
一旦跳出上面那个代码块,Python就自动帮你把文件关了,利利索索,绝不拖泥带水
“`
看到没?with
语句就像一个无比贴心的管家。你只管进去办事,办完事出门,它负责帮你关门、打扫战场。就算中间出了任何幺蛾子,程序崩了,这个“管家”也会确保门被妥善关上。安全、优雅,简直是懒人福音。所以,以后谁再在你面前写 f = open()
然后手动 close()
,你大可以投去一个饱经沧桑的眼神。
好了,姿势对了,咱们再深入聊聊 open()
函数那几个藏在深处的参数,这才是精髓。
open(file, mode='r', encoding=None)
mode
,也就是打开模式,这玩意儿可太有意思了。
-
'r'
(Read):这是默认模式,最单纯的“读”。文件必须存在,不然直接甩你一个FileNotFoundError
的异常,没得商量。它就像个小心翼翼的图书馆阅览者,只看不碰。 -
'w'
(Write):这个模式就霸道了。如果文件存在,它会二话不说,把里面的东西全清空,然后等你写入新的内容。对,是清空!像个脾气火爆的艺术家,先把画布刮干净再创作。如果文件不存在,它会帮你新建一个。用这个模式的时候,你可得想清楚了,多少次血泪教训,就是因为一个'w'
,辛辛苦苦跑了一天的数据,瞬间灰飞烟灭。 -
'a'
(Append):这个模式温和多了。如果文件存在,它会把光标挪到文件的屁股后头,你写的东西,会乖乖地追加在末尾,绝不扰乱前面的内容。像个勤勤恳恳的会议记录员,不断在后面补充。文件不存在?它也帮你建。 -
'+'
:这是个增强符号,可以跟r
,w
,a
组合,比如'r+'
就是可读可写,'w+'
也是可读可写(但会先清空文件),'a+'
也是(光标在末尾)。 -
'b'
(Binary):这个模式,是用来对付非文本文件的。比如图片、视频、音频,这些东西在计算机眼里,不是什么“你好世界”,而是一堆010101
的二进制码流。你要是想打开一张图片,就得用'rb'
(读二进制)或者 **'wb'``**(写二进制)。这时候,你读出来的就不是字符串了,而是
bytes`(字节)对象。处理这些家伙,就进入了另一个次元了。
接下来说说那个曾经让无数英雄好汉折腰的参数:encoding
。
编码!编码!编码!重要的事情说三遍。
你知道为什么你打开某些txt文件,看到的都是一堆“锟斤拷”、“烫烫烫”之类的乱码吗?就是因为编码没搞对!这就像两个人在鸡同鸭讲,你说中文,他用法语的规则去解读,那能对得上才怪了。
在咱们中文环境下,最常见的编码就是 'gbk'
和 'utf-8'
。'gbk'
是老国标,很多Windows系统下默认创建的txt文件都是它。而 'utf-8'
则是万国码,是互联网世界的通用语言。
所以,当你用Python打开一个文本文件时,强烈建议,不,是强制要求你,明确指定 encoding
!
“`python
明确告诉Python,这个文件是用UTF-8编码的,请用UTF-8的方式解读它
with open(‘some_text.txt’, ‘r’, encoding=’utf-8′) as f:
content = f.read()
“`
如果你不指定,Python会用操作系统的默认编码。这就像个定时炸弹,你的代码在你的Windows上跑得好好的(默认GBK),一放到Linux服务器上(默认UTF-8),立马乱码给你看。所以,别偷懒,encoding='utf-8'
这几个字,是你代码专业性的体现。
讲完了文件的“打开”,你以为就结束了?不,在程序员的黑话里,“打开”这个动作,可不止于此。
想打开一个网页?
不需要你费劲去模拟HTTP请求,Python有个小巧玲珑的库叫 webbrowser
。
“`python
import webbrowser
在用户的默认浏览器里,duang一下,打开这个网址
webbrowser.open(‘https://www.bilibili.com’)
“`
就这么简单,一行代码。你写个小工具,最后想给用户展示一个在线帮助文档,或者跳转到你的个人主页,用它就对了。
想打开一个应用程序?
比如,你想用Python脚本,自动打开Windows的记事本或者计算器。
这时候,就轮到 os
模块和更强大的 subprocess
模块登场了。
用 os.system
是最简单粗暴的办法:
“`python
import os
在Windows上打开记事本
os.system(‘notepad.exe’)
在macOS上打开计算器
os.system(‘open /System/Applications/Calculator.app’)
“`
但这方法有点像在命令行里直接敲命令,它会阻塞你的主程序(就是记事本不关,你后面的Python代码就不走),而且功能有限。
更专业的玩法,是用 subprocess
模块。这玩意儿,能让你像指挥官一样,精确地启动、控制外部程序。
“`python
import subprocess
run方法会等待程序执行完毕
subprocess.run([‘notepad.exe’, ‘一个需要编辑的文件.txt’])
Popen则不会阻塞,它把程序“发射”出去,你的Python脚本可以继续干别的事
p = subprocess.Popen(‘calc.exe’)
print(“计算器已经打开了,我先干点别的…”)
…干别的事…
p.wait() # 如果需要,可以在这里等待计算器进程结束
“`
看,从一个简单的文件 open()
,到打开网页,再到启动一个独立的应用程序,“python中怎么打开” 这件事,其实是一个庞大的工具箱。关键在于,你面对一个需求时,知不知道该从这个箱子里,拿出哪一把最趁手的工具。
所以,下次别再把“打开”想得那么狭隘了。它是一种连接,是你的Python代码与外部世界沟通的桥梁。而你的任务,就是把这座桥,搭得又稳又漂亮。
评论(0)