说真的,刚开始玩 Python 那会儿,碰上 txt 文件,我简直是一脸懵。数据都在里头呢,怎么让我的代码兄弟把它“看”懂、把里面的东西“拽”出来啊?或者反过来,我辛辛苦苦算出来的结果,怎么给它整整齐齐地“塞”进一个 txt 里存好?这 文件操作,看着简单,里头弯弯绕还真不少。最基础的,就是这个打开文件的动作。
你肯定听说过 open()
这个函数吧?没错,这就是 Python 里打开文件的“钥匙”。语法嘛,基础款是这样的:open(文件名, 模式)
。就这么仨瓜俩枣?看起来简单,但别急,坑就在细节里。
最常用的模式是什么?读取文件,那就是 'r'
(read);想往文件里写东西,用 'w'
(write);要是怕把原来的内容冲掉,想在文件末尾接着写,那就 'a'
(append)。还有些别的模式,比如 'b'
(binary) 处理非文本文件,'+'
(update) 能读也能写,但咱们今天主要聚焦 txt,就先盯着 'r'
, 'w'
, 'a'
说。
比如,我想打开一个叫 my_data.txt
的文件,只是为了读里面的内容,我就这么写:
“`python
f = open(‘my_data.txt’, ‘r’)
接下来就可以从 f 里读数据了…
“`
看着没啥问题对吧?但这里有个超大的陷阱!文件打开了,就像你开了一扇门,用完了得关上啊!不然系统资源占着不说,有时候你写进去的东西可能还没真正存盘,程序出个岔子,数据就丢了。所以,打开文件后,用完了切记要关闭!就像这样:
“`python
f = open(‘my_data.txt’, ‘r’)
读文件操作…
f.close() # 千万别忘了这一步!
“`
但是!你有没有觉得这样写很麻烦?而且要是中间读文件的时候出错了,比如文件不存在,或者权限不对,程序崩了,f.close()
那句代码根本就执行不到,文件就一直开着,成了一个悬而未决的“幽灵连接”。贼烦!
所以,有没有更好的办法?当然有!Python 大神们早就想到了,这就是我强烈推荐、也是最最标准的打开文件姿势:使用 with open(...)
语句块!
“`python
with open(‘my_data.txt’, ‘r’) as f:
# 在这个缩进块里操作文件 f
# 读写代码放这里…
代码执行到 with 块外面时,文件 f 会自动关闭,
不管中间有没有出错!省心又安全!
“`
看到没?with open(...) as f:
,这简直是 Python 文件操作的黄金法则!它就像给你一个限时卡,在这个 with
划定的地盘里,你可以随便“折腾”这个文件对象 f
,一旦你出了这个地盘(with
块的缩进结束),Python 会自动帮你把文件关得死死的。太贴心了有没有!再也不用担心忘记 f.close()
了,也不用怕程序异常导致文件泄露。以后 Python 怎么打开 txt 文件,脑子里第一反应就应该是 with open(...)
!
好了,门是打开了,那怎么把里面的东西拿出来?
如果你想一次性把整个文件的内容都读出来,用 f.read()
就行:
python
with open('my_data.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)
注意了!这里我偷偷加了个参数:encoding='utf-8'
。这个参数巨重要!尤其是在处理包含中文的文件时。不同的操作系统、不同的编辑器保存 txt 文件时,可能会用不同的编码方式(比如 GBK, UTF-8)。如果打开时指定的编码和文件实际编码不一致,读出来的内容就会变成一堆乱码,就是那种看了头皮发麻的“锟斤拷”或者方框。我刚学的时候就因为这个摔过大跟头,明明文件里写的是中文,读出来鬼知道是什么!所以,养成好习惯,打开 txt 文件时,尽量加上 encoding='utf-8'
。utf-8
是国际通用的编码,兼容性最好。当然,如果确定是其他编码,就改成对应的,比如 encoding='gbk'
。
接着说读取。如果文件很大,一次性 read()
到内存可能会撑爆。这时候,通常我们会选择一行一行地读。Python 里有几种方法:
f.readline()
:每次读一行。重复调用,直到读完。读到文件末尾就返回空字符串''
。
python
with open('my_data.txt', 'r', encoding='utf-8') as f:
line1 = f.readline()
line2 = f.readline()
# ... 这样一行一行读f.readlines()
:把文件的所有行都读出来,放在一个列表中,列表的每个元素就是文件里的一行(包含换行符\n
)。
python
with open('my_data.txt', 'r', encoding='utf-8') as f:
all_lines = f.readlines()
# now all_lines is a list like ['第一行\n', '第二行\n', ...]- 直接遍历文件对象
f
:这是最优雅、最省内存的方式!Python 的文件对象本身就是一个迭代器,可以直接用for
循环遍历,每次循环得到的就是文件的一行。
python
with open('my_data.txt', 'r', encoding='utf-8') as f:
for line in f:
# line 就是文件的一行,包含了换行符
print(line.strip()) # strip() 可以用来去掉行末的换行符和空白符
我个人最喜欢第三种方法,简洁高效,尤其处理大文件时,它不会一次性把所有内容加载到内存,而是读一行处理一行,内存占用小得多。
好了,读取讲完了,那往文件里写入呢?
前面说了,写入模式用 'w'
或 'a'
。
'w'
模式:打开文件,如果文件存在,会清空原有内容再写;如果文件不存在,就新建一个。危险操作! 用之前三思!
'a'
模式:打开文件,如果文件存在,会在文件末尾追加内容;如果文件不存在,就新建一个。通常比 'w'
安全。
写入的函数主要是 f.write(字符串)
。注意,write()
函数只接受字符串作为参数。如果你想写数字或其他类型的数据,得先转换成字符串。
“`python
使用 ‘w’ 模式写入 (会覆盖原文件内容)
with open(‘output.txt’, ‘w’, encoding=’utf-8′) as f:
f.write(‘这是要写入的第一行。\n’)
f.write(‘这是第二行。\n’)
f.write(str(123) + ‘\n’) # 数字要先转成字符串
使用 ‘a’ 模式追加写入
with open(‘output.txt’, ‘a’, encoding=’utf-8′) as f:
f.write(‘这是追加的新内容。\n’)
f.write(‘又追加一行。\n’)
“`
如果你有很多行内容(比如在一个列表中),想一次性写入文件,可以用 f.writelines(可迭代对象)
。注意,writelines()
不会自动给你加换行符,所以如果列表里的每行末尾没有 \n
,写进去的文件就会所有内容挤在一行。通常我们会这样做:
“`python
lines_to_write = [‘第一行\n’, ‘第二行\n’, ‘第三行\n’]
with open(‘bulk_write.txt’, ‘w’, encoding=’utf-8′) as f:
f.writelines(lines_to_write)
或者如果你的列表是这样 [‘第一行’, ‘第二行’, ‘第三行’]
你可以先处理一下再加上换行符
lines_no_newline = [‘第一行’, ‘第二行’, ‘第三行’]
lines_with_newline = [line + ‘\n’ for line in lines_no_newline]
with open(‘bulk_write_processed.txt’, ‘w’, encoding=’utf-8′) as f:
f.writelines(lines_with_newline)
“`
看到这里,你对 python 怎么打开 txt 文件,怎么读,怎么写,是不是心里就有谱多了?核心就是那个 with open(...)
,然后根据你的需求选择模式 ('r'
, 'w'
, 'a'
) 和读取/写入方法 (read()
, readline()
, readlines()
, write()
, writelines()
),并且永远别忘了编码 (encoding='utf-8'
) 这个细节!
文件操作是编程里特别基础又特别常用的技能。学好这个,你就能用 Python 处理各种文本数据,从简单的日志文件到复杂的配置信息,都能轻松拿下。所以啊,多练练手,自己建个 txt 文件,用各种模式打开读读写写,亲手体会一下不同模式的区别,尤其是 'w'
会清空文件这个特点,一定要小心!多踩几个编码的坑,你就彻底记住了。
总而言之,python 怎么打开 txt 这事儿,有了 with open
,加上对模式和编码的理解,就没那么玄乎了。勇敢去尝试吧!
评论(0)