python 状态码转字典文本_Python 基本功: 4. 读写文件

385eebebbae713de8d87d277769bf0aa.png

基本功3 教程带你了解了 Python 自带的几种数据类型:

多多教Python:Python 基本功: 3. 数据类型​zhuanlan.zhihu.com
8787ecbe83b655c85a5f943a9270bf71.png

在知道如何在 Python 中创建不同类型的数据变量之后,我们需要把数据从数据源放入 Python 的程序,所以这篇教程讲的是 Python 的读写文件功能,能把保存在文本中的数据读取到 Python 然后可以进行处理,处理完之后再储存起来。

没错,我在封面放了一个莎士比亚的书,在阅读完这篇教程以后你就了解为什么了,嗯。

教程需求:

  • Mac OS (Windows, Linux 会略有不同)
  • 安装了 Python 3.0 版本以上, Anaconda

不规则数据 Unstructured Data

文本数据是我们人类平常接触非常多的数据类型,打开电脑里面的文件夹存放的大多数都是文本数据。事实上文本数据是很复杂的数据结构,里面可以包含各种数据格式,逻辑关系,不同的语言种类等,是属于不规则数据。

假如现在有一个文件:

99e6837167b8f48e8ef818716ed495ac.png
shakespear_sonnet1.txt

这个文件里有14行英文,是莎士比亚的一首14行诗。我们知道诗里大多都是文字,但是也有可能有数字,还有一些标点符号,并且每一行的长短不一,所以诗本身是一个不规则数据。

那我们来尝试读取到 Python,中,这里用的是 Anaconda Jupyter Notebook:

In [1]:txt_file = "shakespeare_sonnet1.txt"
In [2]:f = open(txt_file, 'r')
In [3]:f.read()
Out[3]:"FROM fairest creatures we desire increase,n
        That thereby beauty's rose might never die,n
        But as the riper should by time decease,n
        His tender heir might bear his memory:n
        But thou, contracted to thine own bright eyes,n
        Feed'st thy light'st flame with self-substantial fuel,n
        Making a famine where abundance lies,n
        Thyself thy foe, to thy sweet self too cruel.n
        Thou that art now the world's fresh ornamentn
        And only herald to the gaudy spring,n
        Within thine own bud buriest thy contentn
        And, tender churl, makest waste in niggarding.n
        Pity the world, or else this glutton be,n
        To eat the world's due, by the grave and thee."
In [3]: f.close()
In [4]: del f

同样的,我们来每一行解释一下 Python 干了什么:

  1. 我们定义了一个字符串变量 txt_file, 来写入我们要读取的文件名。
  2. 通过调用 Python 自带的 open() 方程,我们打开了这个文件,并且把这个文件的开头赋予在了一个变量叫 f, f 是一个文件指针类, 这个概念需要深入到文件系统内核,这里就不深入了。open() 传入的第二个参数是 'r', 代表了文件以只读形式打开,如果要支持读写就传入 'r+' 或者 'w+',还有其他模式包括 'rb', 'rb+', 'w', 'wb+', 'a' 等等,具体可以参考下面这个链接。
  3. 读取文件指针从文章开头读取到结束,并且打印出来。
  4. 关闭文件指针,也就是关闭了文件。
  5. 在 Python 内存中删除文件指针类。
Python open() 函数​www.runoob.com

With 语境 (Context 管理)

Python 里的变量也有自己的 Context,也就是变量自己的生命周期。我们知道如果在电脑里我们打开了一个文件,在同时用另外一个程序打开同一个文件时,会出现文件版本的冲突。比较好的方法是在一个程序里打开一个文件,操作完成之后关闭,然后再用下一个程序打开。在 Python 里是相同的概念,我们需要调用 open() 去打开文件,read() 读取文件,close() 关闭文件,并且用 del 删除文件指针,就像上一段代码的 2-4 行。这里的 del 是一种内存释放,或者垃圾回收的处理方式,其实不是很常用,因为不够 Pythonic,这个会在之后的教程中讲到。

With 语境可以帮你管理变量的生命周期,也就是 Context 上下文管理。利用 With 语境可以非常 Pythonic 的读写文件,并且不用去担心文件打开关闭删除这类的繁琐操作:

In [1]:with open(txt_file, 'r') as file_to_read:
           for line in file_to_read.readlines(): 
              print(line)

       FROM fairest creatures we desire increase,

       That thereby beauty's rose might never die,

       But as the riper should by time decease,

       His tender heir might bear his memory:
       ...

In [2]:with open(txt_file, 'a') as file_to_write:
          file_to_write.write('nBye')

同样的,每一行来解释一下:

  1. With ... as 语句的意思是,在调用了 open() 方程之后,返还的文件指针类就是 as 之后的 file to read, 然后这个文件指针变量就会在 With 的语境存活,直到 With 的语境结束。那什么时候是 with 语境结束呢?就是 Python 的 跳格键 (Tab) 回归0的时候。我们这里的第一句话 Tab 为 0;第二句话 Tab 为 1,因为 for line .. 的一开始有一段跳格;而第三句话跳格为 2, 因为前进了两个 Tab 的距离,然后当下一行代码 In [2] 又回到了 Tab 为 0 的时候,语境就结束了。这三句话干的事情就是读取每一行然后打印出来。
  2. 这里同样的用 With ... as 语句来打开文件,我们知道因为上一段用了 with 语境管理,所以文件已经被安全的关闭了,我们可以再一次打开并且不受之前的影响。而我们这次打开用的是 open(..., 'a') 模式,也就是添加 (Append) 模式。这个模式支持在文件后面添加新的文本,并且写入保存。这里我写入了 'nBye' 在文本的最后,'n' 在字符串里代表了换行,也就是在新的一行开始写入 ‘Bye’。完成执行之后打开文本你会看到结果。

文件解析 File Parse

不规则文件形态多样,上文的例子是一首简单的14行诗句,每一行就是一系列的字符串。但是遇到像每一行里需要拆分解析的文本类型,例如:

084b9f597c8773fce56f7fe38450489c.png
日期,价格 金融数据文本,abc_date_price.txt

这里的一个文件储存的是某金融产品的日期,价格,每一行代表了在当日的一个价格。面对这样的文本,我们需要在读取数据的同时做解析,然后把我们需要的数据存入相对应的容器中:

In [1]: from datetime import datetime
In [2]: date_abc_file = "abc_date_price.txt“

In [3]: abc_dict = dict()

        with open(abc_file, 'r') as file_to_read:
            for line in file_to_read.readlines(): 
                # 逗号是分隔符,Delimiter 
                date_str, price_str = line.split(',')  
        
                # 读取的字符串,转换成对应的数据类型
                dt = datetime.strptime(date_str, '%m/%d/%Y')
                price = float(price_str)
        
                # 再转换成字符串方便打印出来查看
                print(str(dt.date()) + ", " + str(price))
        
                # 数据存入字典,以之后调用
                abc_dict[dt] = price

Out [3]: 2019-07-18, 9682.24
         2019-07-17, 9411.61
         2019-07-16, 10858.7
         2019-07-15, 10195.0
         2019-07-14, 11378.23
         2019-07-13, 11810.0
         2019-07-12, 11338.9
         2019-07-11, 12090.99
         2019-07-10, 12577.85
  1. 从日期库里获取日期子库,用于之后的字符串->日期数据类型转换。
  2. 定义文件名变量。
  3. 我们在进入 With 语境之前先创建了一个字典,用来存储读取文件的数据,注意因为这个字典是在 With 语境之外创建的,所以 With 语境的结束不会摧毁这个字典,我们会在之后的代码看到。在进入 With 语境之后,我们通过逗号分隔了两组数据,并且分别转换成相对应的数据类型,这里在日期转换的时候用到了 '%m/%d/%Y' 格式,代表了 月/日/年,所以在转换的时候 Python 知道原数据的格式是什么。随后我们把读取出来的数据打印出来看看效果,然后按照 日期 (key) -> 价格 (Value)的形式存入字典。我们可以看到打印出来的结果和我们读取文件的数据是一样的,只不过格式略有转换。
In[4] abc_dict
Out[4]:{datetime.datetime(2019, 7, 18, 0, 0): 9682.24,
 datetime.datetime(2019, 7, 17, 0, 0): 9411.61,
 datetime.datetime(2019, 7, 16, 0, 0): 10858.7,
 datetime.datetime(2019, 7, 15, 0, 0): 10195.0,
 datetime.datetime(2019, 7, 14, 0, 0): 11378.23,
 datetime.datetime(2019, 7, 13, 0, 0): 11810.0,
 datetime.datetime(2019, 7, 12, 0, 0): 11338.9,
 datetime.datetime(2019, 7, 11, 0, 0): 12090.99,
 datetime.datetime(2019, 7, 10, 0, 0): 12577.85}

In 5]:abc_dict[datetime(2019, 7, 18, 0, 0)]
Out[5]:9682.24

4. 我们查看这个字典里的数据,发现已经全部存储完毕。

5. 在字典里通过日期 2019/7/18 查看价格,输出结果是 9682.24。


小结

处理不规则文本数据是数据清洗 (Data Cleaning) 非常重要的一个环节,其实在一个大数据为中心的时代,能正确的处理好不规则数据代表着一个任务70%已经成功的完成了。因为这篇是属于基本功系列,所以文本做的处理比较简单,整套的数据清洗流程会在之后的教程中详细介绍。

这里提一下 不规则数据 数据清洗 在下面各领域中都有很重要的角色:

  • 商业分析 (Business Analyst)
  • 金融工程 (Financial Engineering)
  • 机器学习 (Machine Learning)
  • 自然语言处理 (Natural Language Processing )

当然文本类型除了 .txt, 还有其他的像 .csv 和 .xlsx, 在处理这些复杂文件类型的时候我们会借用已经做好的 Python 库来帮助我们很轻松的完成任务。有兴趣的可以参考:

pandas.read_csv - pandas 0.25.1 documentation​pandas.pydata.org

最后说一下封面为什么用莎士比亚,因为现在你已经可以直接用 Python 学习莎士比亚的诗,并且自动模仿一篇新的莎士比亚体的诗出来 hhhhhh ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值