python怎么读取txt:路径写错是最容易卡住的地方

python怎么读取txt:路径写错是最容易卡住的地方

前几天整理文本素材的时候,一直在琢磨python怎么读取txt,敲了好几行代码,运行之后直接抛报错,盯着控制台看了半天,才反应过来根源不在读取函数本身,而是文件位置的问题。那时候把txt文件随便放在桌面,代码里只写了文件名,程序根本找不到它,反复试了好几次,一会报找不到文件,一会又出现编码提示,折腾挺久才勉强跑通。

最先上手写的是read(),直接一次性把整篇文本全部读进变量里。文件不大的时候用这个还算省心,一行代码就能拿到全部内容,打印出来也能完整看到文字。就是后面处理几千行的长文档的时候,一下子把所有内容加载进来,占用的内存会变高,滚动查看内容也不方便,那个时候才意识到这个写法有局限。

换了readline()去试,一次只读一行。循环套上之后,逐行拿数据,适合那种一行一条记录的txt,比如简单的清单。但它读的时候会连带换行符一起读出来,输出的时候行和行之间空一大截,还要额外用strip()去清理多余的换行和空格,多写一步处理语句,对我这种记性不好的人来说,很容易忘掉。

readlines()是另外一种,读完全部内容之后,返回一个列表,txt里每一行内容单独作为列表里面一个元素。拿到列表之后,想要筛选某几行、切片截取都方便,适合需要随机挑取部分内容的场景。只是它同样会带上换行符号,文件体量很大的时候,和read()一样,会一次性加载全部内容,内存开销不会变小。

后来才慢慢习惯用with语句打开文件,不用手动写close()去关闭文件流。之前试过不用with的写法,打开文件之后忘记关闭,重复运行几次代码,偶尔会出现文件占用的提示,再去打开这个txt文档的时候提示被占用。with自带上下文管理,代码块跑完自动释放,省去很多麻烦,我后面基本上都固定用这个结构写读取txt的代码。这只是我的个人感受,不是标准答案。

编码是另外一个绕不开的点。

保存txt的时候系统默认编码和python默认编码对不上的时候,直接跑代码就会冒出乱码,中文一堆问号或者方框。最开始随便换编码参数,一会utf-8,一会gbk,碰运气式调试,有时候gbk能打开,换一个文档又不行。现在会先留意txt保存时选的编码格式,在open里面加上encoding参数,指定和文件匹配的编码,乱码的情况少了很多,但也不是所有文档都能一次性匹配成功。

相对路径和绝对路径的区别,也是慢慢试出来的。写绝对路径,把完整文件地址粘贴进去,程序定位文件稳定很多,但是换一台电脑,或者把项目文件夹挪位置,路径直接失效,代码就跑不起来。相对路径就灵活一点,txt文件和py脚本放在同一个文件夹下,直接写文件名就行,挪动整个文件夹之后不用改代码,前提是两个文件位置一直保持在一起。

还有一些零碎的小状况,比如txt名字里面带中文、带空格,有时候也会引发意料之外的报错,之后保存文件的时候,尽量用英文简单命名,减少额外麻烦。空行、末尾多余的空白字符,读取进来之后也会留在数据里,如果后续要做统计、匹配内容,就要提前做好清洗。

不会去追求一个万能写法,不同txt文件大小、内容格式不一样,挑合适的读取方式就行。小文件想快速看全文,直接read;需要逐行处理,用readline循环;需要按行存成列表做筛选,就用readlines,外层套上with语句,指定好编码。没有哪一种写法能适配所有txt文档,每次拿到新的文本文件,都要简单调整一下参数再运行。

上次调试完这段代码,保存好脚本,关掉编辑器,没有继续往下写文本处理逻辑。