Python 全栈:必备文件操作练习

  • 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)
 in 
----> 1 read_file('D:/source/python-zhuanlan/update_log.md')

 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++ 查看文件编码格式,查看方式如下图所示:

image-20200221211152512

下面,读入成功:

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 函数按行一次读取整个文件。读入文件小时,使用它们没有问题。

但是,如果读入文件大,readreadlines 一次读取整个文件,内存就会面临重大挑战。

使用 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.txtr+ 表示读写模式。代码块实现:

  • 每次读入一行

  • 选择正则 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---')

你可能感兴趣的:(Python 全栈:必备文件操作练习)