python实现对文本文件加行号

目前,需要对文本文件加入行号,就想到了用python来实现。原以为很简单的,结果也发现出了很多问题。

要在文本文件中加入行号的话,就要实现对文本文件的同时读和同时写,之前都是只用过单独对文件进行读或者写操作。

发现不能只是在打开文件的时候,用r+方式打开这么简单。因为文件的读取和写入是依据文件位置指针的。读数据和写数据都是在文件当前位置指针开始处操作的。

之前想的想法是,在读取一行数据之前,将当前文件指针记录下来,然后执行读一行操作,这个文件指针就到下一行了。然后将读的数据加上行号,将文件指针修改为上一行首的文件指针,在将数据写入,这样,不就处理了一行了。接着处理第二行。

clip_image001

   代码好像是能实现的,运行看。

clip_image002clip_image003

第一个是源文件内容,第二个是加入行号的文件内容。

这明显不对啊。源文件的数据都不见了。是什么地方出现问题了。

原来就是文件位置指针的问题。

对于一个文件,文件位置指针的值范围是确定的。从0开始到文件末尾。当我们在读第一行之前,文件位置指针是0,读完一行后,文件位置指针是13。因为hello world的大小是11,但是别忘记后面有个\n。所以第一行有12个,第二行开头的位置就是13. 这个时候,将数据读出来了,在前面加入了1    总共7个数据。那么写入的数据就是19个数据。这个时候,将文件位置指针指到上一行首,就是0,在写入19个数据。看出,第一行是顺利的写入了。但是之前,第二行的行首位置是13,现在第一行的数据已经超过13了。所以多的6个数据就把原来的第二行的前6个数据给覆盖了。所以就发现第二行的内容不见了。后面的依次类推,就发现数据就变成这个样子了。

 

上面的方法是行不通了,那就用笨的方法来实现。先将源文件重命名,然后再新建一个源文件,将重命名的文件内容读出来,在修改,然后写入新的源文件中。处理完毕后,将重命名的文件删除掉。似乎是要麻烦一些。

这里,就要用到两个自带函数。这个两个函数是在os模块包里面的。

os.renameoldnew)将旧文件名改为新的文件名。

这里oldnew可以使文件的绝对路径,也可以直接填文件的名字,这样,就默认在当前目录下。注意,写绝对路径的时候,\是要有两个的。不然在路径前加r也行。

如:

‘d:\\daima\\python\\text.txt’   或者是r’d:\daima\python\text.txt’

 

os.removefile)将文件删除掉。

这里file可以使用文件的绝对路径,也可以直接写文件的名字,这样,默认在当前目录下。和上一个函数注意的一样。

 

所以,整个代码就是如下了。

clip_image005

先将源文件改个名字,然后再新建一个源文件,将数据读进来,处理后,在写入新的源文件中。最后再删除掉重命名的文件。

这里,打开文件是使用codecs模块中的open函数。因为文件是有可能用中文的,这样,用open函数打开的话,就会有异常,说有些字符不认识。所以这样使用cedecs的模块的open函数打开,打开格式是utf-8。这样,就可以处理中文文本了。

 

clip_image007

clip_image009

这样,结果不就对了。

 

使用中文文本来测试,也是可以的。

clip_image011

clip_image013

通过上面这样方法,就可以实现对文本的又读又写,不过这中间要转一道,挺麻烦的,能不能直接对文本进行操作了,不用对文件重命名,新建,处理,删除。

这种方法就是,先将文本文件的数据全部给读进来,存在一个列表中。然后再对这个文件进行写操作,在遍历每一行,将每行数据处理了在写进文件中。

代码就比较简单了。

clip_image014

这样,就不用中间对文件要进行一系列的处理了。但是这种也有问题。如果,文件非常的大,一次性读取,那是很耗空间和时间的。这个时候,就只能一行一行读取,一行一行处理,在写入到文件中了。        

 

此条目发表在python, 编程语言分类目录,贴了标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。