- 80 文件读操作的案例
- 81 文件按行读的案例
- 82 文件写操作的案例
- 83 如何获取文件名?
- 84 如何获取后缀名?
- 85 获取指定后缀名的文件
- 86 如何批量修改后缀名?
- 87 xls 批量转换成 xlsx 的案例
- 88 批量获取文件修改时间
- 89 批量压缩文件的方法
- 90 32 位文件加密
- 91 定制文件不同行的案例
- 92 文件列表
- 93 遍历目录与子目录,抓取 .py 文件
80 文件读操作的案例
文件读、写操作比较常见。
读取文件,要先判断文件是否存在。
- 若文件存在,再读取;
- 不存在,抛出文件不存在异常。
In [8]: import os
In [9]: def read_file(filename):
...: if os.path.exists(filename) is False:
...: raise FileNotFoundError('%s not exists'%(filename,))
...: f = open(filename)
...: content = f.read()
...: f.close()
...: return content
试着读取一个 D 盘文件:
In [13]: read_file('D:/source/python-zhuanlan/update_log.md')
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
<ipython-input-13-92e8f4011b20> in <module>
----> 1 read_file('D:/source/python-zhuanlan/update_log.md')
<ipython-input-12-5591c3ba7b42> in read_file(filename)
3 raise FileNotFoundError('%s not exists'%(filename,))
4 f = open(filename)
----> 5 content = f.read()
6 f.close()
7 return content
UnicodeDecodeError: 'gbk' codec can't decode byte 0xaa in position 46: illegal multibyte sequence
出错!在 f.read
这行,有错误提示看,是编码问题。open
函数打开文件,默认编码格式与平台系统有关,鉴于此,有必要在 open
时为参数 encoding
赋值,一般采用 utf-8
:
In [9]: def read_file(filename):
...: if os.path.exists(filename) is False:
...: raise FileNotFoundError('%s not exists'%(filename,))
...: f = open(filename,encoding='utf-8')
...: content = f.read()
...: f.close()
...: return content
代码打开文件的编码确认为 utf-8
后
还需要确认,磁盘中这个文件编码格式也为 utf-8
推荐使用 notepad++
查看文件编码格式,查看方式如下图所示:
下面,读入成功:
In [22]: read_file('D:/source/python-zhuanlan/update_log.md')
Out[22]: '更新日志\n\nDay4: \n\n> 下面总结 10 个列表和元祖使用的经典例子,通过练习,进一步加深对它们提供的方法的理解。\n\n10个改为 13个\n\n\n\nDay6:\n\n第12个,13个间有多余的空行
上面,还提到 open
后,务必要 close
,这种写法有些繁琐,还容易出错。
借助 with
语法,同时实现 open 和 close 功能,这是更常用的方法。
In [9]: def read_file(filename):
...: if os.path.exists(filename) is False:
...: raise FileNotFoundError('%s not exists'%(filename,))
...: with open(filename,encoding='utf-8') as f :
content = f.read()
...: return content
81 文件按行读的案例
read
函数一次读取整个文件,readlines
函数按行一次读取整个文件。读入文件小时,使用它们没有问题。
但是,如果读入文件大,read
或 readlines
一次读取整个文件,内存就会面临重大挑战。
使用 readline
一次读取文件一行,能解决大文件读取内存溢出问题。
文件 a.txt
内容如下:
Hey, Python
I just love Python so much,
and want to get the whole Python stack by this 60-days column
and believe Python !
如下,读取文件 a.txt
,r+
表示读写模式。代码块实现:
每次读入一行
选择正则
split
分词,注意观察a.txt
, 单词间有的一个空格,有的多个。这些情况,实际工作中确实也会遇到。使用
defaultdict
统计单词出现频次按照频次从大到小降序
In [38]: from collections import defaultdict
...: import re
...:
...: rec = re.compile('\s+')
...: dd = defaultdict(int)
...: with open('a.txt','r+') as f:
for line in f:
...: clean_line = line.strip()
...: if clean_line:
...: words = rec.split(clean_line)
...: for word in words:
...: dd[word] += 1
...: dd = sorted(dd.items(),key=lambda x: x[1],reverse=True)
...: print('---print stat---')
...: print(dd)
...: print('---words stat done---')