嘿,哥们儿,或者姐们儿,反正就是你!在敲python代码的时候,是不是总得跟文件打交道?读取点数据啊,写点结果啊,日志啊什么的。别告诉我你没遇到过“python 怎么打开文件”这个问题,我打赌你遇到过,甚至现在就在为这事儿挠头。说实话,刚开始学那会儿,我也挺懵的,什么读啊写啊追加啊,权限模式一堆字母,看得头都大。但摸爬滚打这么久,总算有点心得了,今天就跟你聊聊这玩意儿,别那么死板,咱们来点活的。
文件,在咱们编程的世界里,就像现实世界里的纸质文档,存着各种信息。要用这些信息,你总得把它“打开”,就像翻开一本书。python提供了好几种方式来干这事儿,最基础、最常用的,当然是那个响当当的open()
函数。记住,它就是钥匙!
open(filename, mode, encoding)
看到没,三个参数最常见:filename
,文件名,字符串形式,可以是相对路径,也可以是绝对路径,就像你告诉电脑文件在哪儿;mode
,模式,这玩意儿是关键,决定了你是要读、要写、还是要追加等等,别小看它,弄错了轻则报错,重则数据全没了,哭都没地儿哭;encoding
,编码方式,这个嘛,尤其处理中文,或者跨平台文件时,简直是救命稻草,比如最常用的'utf-8'
,能避免很多乱码的悲剧。
咱们先说模式,这可是重头戏。常见的有几种:
'r'
:读模式(read)。这是默认模式,你不写它也行。顾名思义,就是把文件打开,准备往里瞅内容。只能读,不能改,也不能写。就像拿到一份只允许观看的报告。文件必须存在,不存在?对不起,直接给你抛个FileNotFoundError
,没商量。'w'
:写模式(write)。这个就霸气了,打开文件准备往里写东西。如果文件已经存在,注意了,重点来了!它会把文件里原有的内容全部清空,从头开始写!如果文件不存在,它会给你新建一个。想清楚再用它,不然辛辛苦苦存的数据,唰一下就没了,欲哭无泪。'a'
:追加模式(append)。这个就温和多了,也是准备往里写。但它不会清空文件内容,而是在文件末尾接着写。如果文件不存在,也会新建一个。就像在日记本的最后一页接着写,之前的记录都还在。'x'
:独占创建模式(exclusive creation)。这个有点像“一次性”模式。只有在文件不存在的时候,它才会新建并打开文件进行写操作。如果文件已经存在,会直接抛出FileExistsError
。这是个安全模式,能帮你避免意外覆盖现有文件。'b'
:二进制模式(binary)。这个不是单独使用的,需要跟上面那些模式组合,比如'rb'
(读二进制)、'wb'
(写二进制)、'ab'
(追加二进制)。处理图片、音频、视频等非文本文件时,就要用它。它不会对文件内容进行任何编码或解码,直接操作原始字节。't'
:文本模式(text)。这是默认模式,你不写也行。跟'b'
相对,处理文本文件时用。它会根据指定的编码方式对文件内容进行编码或解码。咱们平时处理.txt
、.py
、.json
等文本文件,用的就是这个模式。
所以,当你写open('my_file.txt', 'r')
,就是用文本模式读取my_file.txt
。写open('my_image.jpg', 'wb')
,就是用二进制模式写入一张图片文件。看明白了吗?模式这东西,组合起来威力更大。比如'r+'
(读写,文件必须存在)、'w+'
(读写,文件不存在则新建,存在则清空)、'a+'
(读写,追加模式,文件不存在则新建)。这些带加号的,表示既能读又能写,只不过起始位置和对已有文件的处理方式不一样。
好了,模式讲完了,那怎么“用”打开的文件呢?
最经典的用法,也是我最推荐的用法,就是使用with open(...) as f:
语句。这玩意儿有个响亮的名字叫“上下文管理器”。它的好处是,无论你在代码块里是成功读写了,还是因为出错抛了异常,它都能确保文件最后被自动关闭。这太重要了!你想啊,文件是个外部资源,就像你打开的水龙头,用完了总得关上吧?不然资源一直占用,可能会导致各种问题,比如文件被锁住,或者程序内存泄漏啥的。
来个例子,读个文件:
python
try:
with open('my_article.txt', 'r', encoding='utf-8') as f:
content = f.read() # 一次性把文件所有内容读进来
print(content)
except FileNotFoundError:
print("哎呀,文件找不到!")
except Exception as e:
print(f"读文件出错了:{e}")
看,with open(...) as f:
,这里f
就是文件对象,你可以把它想象成那个“文件本身”或者“文件操作句柄”。然后就可以调用它的方法了,比如f.read()
,把文件里的所有内容都读出来,变成一个字符串。如果你文件特大,一次性读进来可能会爆内存,那就得一行一行读,用f.readline()
或者直接遍历文件对象:
python
try:
with open('my_large_log.txt', 'r', encoding='utf-8') as f:
for line in f:
print(line.strip()) # 用strip()去掉行尾的换行符
except FileNotFoundError:
print("日志文件不见了!")
这样就优雅多了,内存压力小很多。当然,还有f.readlines()
,会把文件所有行读到一个列表里,每行是一个字符串,包含换行符。
写文件呢?也用with
:
python
with open('new_data.txt', 'w', encoding='utf-8') as f:
f.write("这是我写的第一行。\n")
f.write("这是第二行,后面加个换行符。\n")
lines_to_write = ["第三行\n", "第四行\n"]
f.writelines(lines_to_write) # 写入一个字符串列表
print("文件写入完成!") # 这时候文件应该已经自动关闭了
看到了吧,f.write()
就是往文件里写字符串,f.writelines()
可以写入一个字符串列表,非常方便。别忘了,'w'
模式是会清空原有内容的哦!
要是想追加呢?换个模式就行:
python
with open('my_diary.txt', 'a', encoding='utf-8') as f:
f.write("今天天气真好。\n")
f.write("学python真开心!\n")
print("日记更新了!")
这样,my_diary.txt
文件里原来的内容还在,新写的这两句话会加在末尾。
那么,不用with
行不行?当然行,但不推荐!手动挡容易翻车。如果你非要手动挡,那流程是这样:
f = open('some_file.txt', 'r')
打开文件,得到文件对象。- 进行读写操作:
content = f.read()
或f.write(...)
。 - 重要!
f.close()
关闭文件。
问题是,万一在第2步出错了呢?异常抛出了,第3步的f.close()
就执行不到了,文件就没关!所以,如果手动挡,你还得加try...finally
来确保关闭:
python
f = None # 初始化为None,防止try块里open失败
try:
f = open('my_risky_file.txt', 'r')
content = f.read()
print(content)
except FileNotFoundError:
print("文件又丢了...")
finally:
if f: # 检查f是否成功打开了(不是None)
f.close()
print("文件手动关闭了。")
你看,这代码比with
方式复杂多了,而且更容易出错。所以,听我的,能用with
就用with
,省心省力,符合“pythonic”精神——让代码更优雅、更简单。
有时候,你可能需要对文件进行更高级的操作,比如移动文件、删除文件、判断文件或目录是否存在等等。这时候,就轮到python的标准库os
模块和shutil
模块登场了。os.path
里有很多判断路径、文件名的方法,比如os.path.exists()
判断路径是否存在,os.path.isfile()
判断是不是文件,os.path.isdir()
判断是不是目录。os
模块里还有os.remove()
(删除文件)、os.rename()
(重命名/移动文件)等等。shutil
模块提供更高级的文件操作,比如shutil.copy()
(复制文件)、shutil.move()
(移动文件或目录)、shutil.rmtree()
(删除目录及内容,慎用!)。这些虽然不是直接“打开”文件进行读写,但它们是文件操作生态系统的重要组成部分,跟文件打交道离不开它们。
总结一下,python 怎么打开文件?核心就是open()
函数,搭配合适的模式和编码方式。操作文件内容,强烈推荐使用with open(...) as f:
上下文管理器,它能保证文件自动关闭,避免资源泄漏。读可以用f.read()
, f.readline()
, 遍历f
对象,写可以用f.write()
, f.writelines()
。处理二进制文件记得加'b'
模式。
当然了,文件操作还有很多细节,比如缓冲区的问题(虽然日常写代码通常不用太操心,with
和close
会处理好),文件指针的位置(可以用f.seek()
来移动读写位置),等等。但对于咱们日常开发来说,掌握open()
函数、模式、encoding
以及with
语句,基本上就能应对大多数场景了。
所以,下次再遇到文件操作,别慌,想想你手里的open()
这把钥匙,想想你想要读还是写还是追加,想想文件是文本还是二进制,然后大胆地用with
语句去操作吧!python的文件操作其实挺直观的,多练练,自然就熟了。记住,实践出真知嘛!
评论(0)