嘿,哥们儿,或者姐们儿,反正就是你!在敲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行不行?当然行,但不推荐!手动挡容易翻车。如果你非要手动挡,那流程是这样:

  1. f = open('some_file.txt', 'r') 打开文件,得到文件对象。
  2. 进行读写操作:content = f.read()f.write(...)
  3. 重要! 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'模式。

当然了,文件操作还有很多细节,比如缓冲区的问题(虽然日常写代码通常不用太操心,withclose会处理好),文件指针的位置(可以用f.seek()来移动读写位置),等等。但对于咱们日常开发来说,掌握open()函数、模式、encoding以及with语句,基本上就能应对大多数场景了。

所以,下次再遇到文件操作,别慌,想想你手里的open()这把钥匙,想想你想要读还是写还是追加,想想文件是文本还是二进制,然后大胆地用with语句去操作吧!python的文件操作其实挺直观的,多练练,自然就熟了。记住,实践出真知嘛!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。