文本处理 =============== 小白的苦恼 --------------- 在接触了列表和字典这两个Python数据类型后,小白如获至宝。很快以字典为存储形式 (如下所示),完成了通讯录的原型开发。 :: _Info = {"张三":'138-1000-2345', "李四":'138-8888-8888'} 接着,小白开始开心地录入全班同学的姓名和联系方式。刚刚开始录入信息的时候,小白依然兴致盎然。可当他录入了20多名同学的信息后,逐渐发现不对劲了!如果用字典存储联系人信息,那么一个人占一行代码。全班60来号人,就有60行代码。如果用户再多,代码文件就基本上变成了联系人信息了。这根本没有办法调试。小白意识到,”为了以后调试方便,得把联系人信息和代码本身分开存放才行。何不把联系人信息存储到一个文本文件中呢?“ 想到这里,小白放弃了继续在代码中录入联系人信息,改把联系人信息放到一个文本文件中。小白把这个联系人信息的文本文件取名为Contact.txt。这个文件中一个人的信息占一行。姓名和电话之间以制作符(Tab键)分隔,格式如下: :: 张三 138-1000-2345 李四 138-8888-8888 王二麻子 138-8888-9999 小白耐心地把全班同学的信息都输入到Contact.txt这个文本文件中了。他还特别地检查了一下班花小红的电话是否输入正确。小红的电话对小白非常重要。 ”终于把数据录完了!“小白舒展了一下筋骨,”下面,应该把文本文件中数据读入,然后再存放到字典这个数据库里就可以了。可是,应该怎么读取文本文件呢?“ 读取文本文件 ---------------- ”我从来没有用Python处理过文本文件。怎么办呢?“。 ”写邮件去邮件列表里问吧?“小白马上有了到邮件列表里问的想法。可是小白转念又想,如果一遇到问题,就写信问大家,可能会被大牛们鄙视的。 ”对了,用必应搜索一下!“经过第一章的探索,小白已经了解到了搜索引擎的强大。他决定向搜索引擎求助。 小白在必应搜索中查找”Python 文本文件“,发现搜索结果中提到了文本读取,创建文本,更新文本等操作概念。“哦,原来文件操作还挺多,有读,创建,更新等”。于是,小白使用新的关键词“Python 文本文件 读”重新搜索,以细化搜索结果。在搜索结果中,小白首先就看来了来自IBM.com的一篇文章, 网址是 http://www.ibm.com/developerworks/cn/linux/sdk/python/python-5/index.html 。“恩,出自IBM,应该靠谱。”小白决定细细地看看这篇文章 ,了解一下Python的文本文件操作。 小白通过了他在网上搜索到的几篇关于文本文件操作的文章,了解到Python读取文本文件主要有三种方法 ,分别是.read(), .readline()和.readlines()。.read()是将整个文件一次性读入,然后存放到一个字符串变量中。网上不太推荐这种文件读取方法。因为一次性读入大文件,可能造成内存溢出,数据存为字符串变量也不太好对数据进行逐行操作。.readline()读入一行。.readlines()是将文件所有内容一次性读入,将文件内容存为一个行的列表。这个列表可以使用for ... in...的结构进行逐行操作。 小白看了一下IBM上的读文件操作,似乎挺简单的。读取一个文件也就三行代码。小白根据示例代码,稍作修改,自己运行了一下。小白修改后的代码如下: :: ''' ReadFileDemo.py By Jibo He @ueseo.org hejibo@ueseo.org Function: demo read file Reference: http://www.ibm.com/developerworks/cn/linux/sdk/python/python-5/index.html Dependencies: Contact.txt ''' fh = open('Contact.txt') for line in fh.readlines(): print line 小白运行了上面的代码,马上看到了Python输出的文本文件内容。小白赞叹道,“Python 大利害了,三行代码就可以读取文件内容。” 以文本文件存储联系人信息 ~~~~~~~~~~~~~~~ 由于Python读取文本文件非常简单,小白很快学会了使用读取文本文件操作。接下来,小白打算实现他先前计划的,把联系人信息存放到文本文件中。小白已经会读文本了,在第一章中已经完成了在字典数据库中搜索联系人的方法 。小白需要做的,就是把文本文件中读到的字符串转存到他先前的字典数据类型中。 这个任务对小白不算太难。小白把先前写的ReadFileDemo.py和dict.py两个文件的代码拷贝到一起,把代码保存为ReadFile2Dict.py,用于将文本文件读取到字典中。将先前写的代码合并到一起后,小白就完成了主要的工作了。现在,只差的是把文本文件中的每一行的信息,存到字典数据_Info中。“怎么将每一行中的联系人姓名和联系方式转存到字典中呢?” 小白思考着这个仅缺的功能。小白比较了代码之前的差异。从文件中读到的每一行的变量line是一个字符串,比如"张三 138-1000-2345"。小白需要的是分别得到"张三"和“138-1000-2345”这两个联系人姓名和联系方式信息。“哦。将文本文件内容转存到字典数据中,实际上缺的功能就是一个字符串提取信息功能呀”。小白恍然大悟!小白翻了翻他在第一章节学习字符串处理和字典数据类型的笔记。很快完成了这个功能。小白使用cell = line.split('\t') 将每一行的数据转化成一个名叫cell的列表。这个cell列表存放着行中的每一个元素,第一个元素就是姓名,第二个元素就是联系方式。然后小白使用_Info[name] = contact 就把联系人姓名和联系方式存放到字典中了。 下面是小白完成的ReadFile2Dict.py的最终代码。ReadFile2Dict.py实现了联系人信息和代码的分离。联系人信息存放在Contact.txt这个文本文件中。ReadFile2Dict.py实现读取文本文件,完成联系人搜索功能。 :: # -*- coding: cp936 -*- ''' ReadFile2Dict.py By Jibo He @ueseo.org hejibo@ueseo.org Function: - read data from Contact.txt - Convert data into a dict - combine features in ReadFileDemo.py and dict.py Reference: http://www.ibm.com/developerworks/cn/linux/sdk/python/python-5/index.html Dependencies: Contact.txt ''' #_Info = {"张三":'138-1000-2345', # "李四":'138-8888-8888'} _Info = {} fh = open('Contact.txt') for line in fh.readlines(): #print line # 将每一行分隔开,提取姓名和联系方式 cell = line.split('\t') name = cell[0] contact = cell[1] #print cell _Info[name] = contact print _Info _run = True while _run: _User_input = raw_input("输入联系人名:") if _Info.has_key(_User_input) == True: print _Info[_User_input] elif _User_input == "退出": _run = False else: print "无此联系人" 小白又运行了自己写的ReadFile2Dict.py多次,把玩自己写的搜索功能。一种成就感油然而生。“我真聪明!”小白默默自喜道。 写文本文件 ~~~~~~~~~~~~~~~~~ 我会使用Python 读文本了,那么写文本应该怎么做呢?已经会读文本了,把写文本也学了吧。 以后继续开发通讯录可能用得着。 通讯录的三个主要功能,搜索,增加和更新。搜索对应的就是读文本操作,增加和更新对应的就是写文本操作了。 小白依照读文本的学习过程进一步探索写文本文件操作。他使用关键词“Python 文本文件 写“在必应中进行搜索,寻找一些写文本的操作方法。由于有了读文本的经验, 写文件也比较类似。这对小白并不难。通过阅读一些搜索结果,小白了解到,写文件包括三个步骤,打开文件,写内容到文件中,然后关闭文件。Python提供了三个非常名副其实的函数来完成这三个文件操作。open函数打开文件,write函数写内容到文件,close函数关闭文件。作为练习,小白写了一个简单的写文本文件的代码,文件名为 WriteFileDemo.py。代码如下: :: ''' WriteFileDemo.py By Jibo He @ueseo.org hejibo@ueseo.org Function: demo write file ''' fh = open('outfile.txt', 'w') fh.write('Hello, Python!') fh.close() 小白运行完WriteFileDemo.py后,将会生成outfile.txt这个文本文件,里面有一行字符串,"Hello, Python!"。 小白伸了伸懒腰,放松一下筋骨,开心地念到,“Python读写文本还真的挺方便的,几行代码就完成了!” 小结 ~~~~~~~~~~~~~~~~ 至此,小白已经掌握了如何使用 Python 读写文本。 Python 提供了open 函数打开文件,使用 readlines() 函数可以读文本,使用 write 函数可以写文本, 最后用close 函数关闭文本。小白将第一章节代码中的联系人信息,转存到文本文件中,然后通过读文本地形式来查询联系人。这很好地提高了代码的可读性。 关键词 ~~~~~~~~~~~~~~~~ open write close readlines readline