Python实例分析(一)删除文本中的空行

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()关闭打开的文件哦。

最终代码:

是不是很简单~

使用效果

源文件

处理完成

我们新手在写代码的时候,经常会遇到各种各样的问题,一定要记得先将重要文件备份,再用来跑代码,其次,每次截取一部分内容出来做测试,如果成功了再处理 真•文本,再者,如果不确定每行代码的结果,可以先逐条逐块地测试,将整个逻辑厘清之后再捏和到一起。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181114G0D07700?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励