Python实例分析(一) 删除文本中的空行
老板要做一个项目,需要处理一个词典的txt文档,这个文档大致内容如下:
我们可以轻松总结出,每段内容行首是以方括号“【】”括起的词条,紧接着是汉语拼音,然后是释义。内容与内容之间有空行做间隔。
我们想要将它变成“【词条】汉语拼音”这样的结构,为以后处理做准备。所以第一个任务就是删除空行,第二个任务就是删除释义。
删除空行实现起来比较简单,所以我们先来讲这个。
文档的打开
这部分内容,上次python实例讲过,这次简单回顾一下:
>>> fpth=input("源文件路径:")
源文件路径:/Users/gaoqy/Desktop/source.txt
>>> fpth
'/Users/gaoqy/Desktop/source.txt'
>>>
首先,我们要得到文件路径以便打开它。第一行fpth=input("源文件路径:")这条命令是在窗口显示“源文件路径:”,我们可以输入路径,然后路径会保存到fpth里。当然在cmd或者terminal里,我们可以通过拖拽文件的方式得到其路径,避免手动输入。
第三行,输入fpth,我们查看一下路径是否正确。
>>> f = open(fpth,'r')
>>>f
打开文件,指定为f,属性为只读。然后在输入f,看到文件的属性,包括路径、属性及编码。
文档的读取与判断是否为空行
打开文档之后,我们要读取其中的内容。上次我们用的是readline(),这个方法一次读取一行内容。那这次介绍另外一个方法,readlines(),这个方法将读取所有内容,并将每一行作为一个列表内的一元素。
readlines()
>>> data = f.readlines()
>>> data
我们先用这个方法读取文档f的内容,并赋值给data,然后我么看一下data的内容:
此时data就成了一个列表,里面的每一个元素就是原文中的一行的内容。比如第一个元素就是第一行,第一行为空,显示的就是'\n';第二个元素就是第二行,显示的是'【吖】...\n' 单引号说明每一元素都是一个字串。
所以我们现在正确的提取了文档的内容,并将每一行作为一个元素,放在了列表data中。下面的逻辑就是,依次判断每个元素内容是否不为空,如果不为空,就说明此行有内容,我们将它写入目标文档中;如果为空,就说明此行是空行,我们不用进行操作,接着判断下一行即可。
因此,最简单的方法就是for循环。(我记得上次有介绍过)
在此之前,先讲一下如何判断是否为空行。我们用到一个新的方法——
split()
split()是用来分割字符串的,通常可以带两个参数,第一个是分割的内容,第二个是分割的次数。如果不填写参数,则默认按照分隔符分割,包括空格、换行符、制表符等。这个方法返回的是分割后的元素组成的列表。
>>> line = "woshiyitiaozifuchuan"
>>> line.split('i',1)
['wosh', 'yitiaozifuchuan']
>>> line.split('i',2)
['wosh', 'y', 'tiaozifuchuan']
>>> line.split('i')
['wosh', 'y', 't', 'aoz', 'fuchuan']
举例说明,定义一个字符串为line,然后我们进行第一次分割,参数分别为'i'和1,然后我们得到了一个列表,两个元素是'wosh' 'yitiaozifuchuan',说明在第一个i的位置进行了一次分割,以此类推。
>>> line = "woshiyitiaozifuchuan"
>>> line.split()
['woshiyitiaozifuchuan']
>>> line = ''
>>> line.split()
[]
当line为有内容的字符串时,split()方法返回的一定是有元素的列表;当line为空字符串时,split()方法返回的就是空列表。有元素的列表的值为1,空列表的值为0,相当于初中数学中空集∅的意思,如果不理解,就死记硬背吧。
所以拿出data中的一个元素来分割一下,得到非空列表,则将这个元素写入到目标文档;得到空列表就不用管它。
for i insequence
for循环可以遍历字符串或者是列表:
>>> line = "woshiyitiaozifuchuan"
>>> for i in line:
... print(i)
>>> line = ['a','b','c','d']
>>> for i in line:
... print(i)
第一段是遍历字符串的例子,第二段是遍历列表的例子。在两个例子中,每次循环,都将遍历到的元素打印出来,两个结果分别为:
所以我们遍历data列表的命令如下即可。
for line in data:
再次强调一下,python中,循环体是靠缩进来表现的,每个代码块的缩进距离要相同,否则系统会认为切换到另一个代码块。一般我们用tab键来进行缩进即可。(灰色块内的缩进不明显,具体请看截图)
>>> for line in data:
... print(line)
我们遍历一下data看看效果。然后我们再将split()方法加入到for循环体中:
>>> for line in data:
... if line.split():
... print(line)
这样是在我们写入文件之前,先看一下效果。对比后发现,'\n'那些元素已经被剔除掉了。所以现在我们可以将print()换成写入方法writelines()。
最后记得要用close()关闭打开的文件哦。
最终代码:
是不是很简单~
使用效果
源文件
处理完成
我们新手在写代码的时候,经常会遇到各种各样的问题,一定要记得先将重要文件备份,再用来跑代码,其次,每次截取一部分内容出来做测试,如果成功了再处理 真•文本,再者,如果不确定每行代码的结果,可以先逐条逐块地测试,将整个逻辑厘清之后再捏和到一起。
领取专属 10元无门槛券
私享最新 技术干货