栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

慕课小伙伴的一个问题,用python读取文件的指定段落

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

慕课小伙伴的一个问题,用python读取文件的指定段落

今天一个购买我课程的小伙伴,问我一个问题.

他的问题描述如下:
“需要读取指定arc.data文件,指定某一个关键字符串为起始位置读取(假设指定字符串为“Wxl”),一直读取到指定的关键字符串为结尾(假设为“3Q8”),截取其间内容,并将内容重定向到另外一个文件。”


文件arc.data内容,部分内容如下: PHRhYmxlIHN0eWxlPklrewriovvcvdsdsf34324gdfldfdsfdvvcxvfr324ddsfdsfsdqr3r323Q8 4324efdsklfdfbrewr3223432l;fdsfdsfdsfdsffsdfewrwer21u12iofdsfdsakfbdsfjbdsajfdfdsfsdfk343423kfdsfsa

对于这个问题,Jeson觉得同学们需要重点掌握内容有如下两部分。

第一,需要了解open() 函数对于文件的处理
file 对象方法方法如下:
file.read([size]) size未指定则返回整个文件,如果文件大小>2倍内存则有问题.
f.read()读到文件尾时返回""(空字串)
file.readline() 返回一行
file.readlines([size]) 返回包含size行的列表,size 未指定则返回全部行 for line in f: print line #通过迭代器访问
f.write("hellon") #如果要写入字符串以外的数据,先将他转换为字符串.
f.tell() 返回一个整数,表示当前文件指针的位置(就是到文件头的比特数).
f.seek(偏移量,[起始位置]) 用来移动文件指针. 偏移量:单位:比特,可正可负 起始位置:0-文件头,默认值;1-当前位置;2-文件尾
f.close() 关闭文件

第二,对于文件的读取思路类比
Jeson老师觉得,我们可以想象成对于一串字符串的读取,假设字符串“abcdefg”,我们要读取c到f中间位置的数据,改如何读取?

答:
(1)我们分别把f的位置读取到,再把c的位置读取到。 f所在的文件指针位置为5,c所在的文件指针位置为2,那么如下: f所在的文件指针位置-c琐杂的文件指针=5-2=共需要读取的长度。
(2)然后调用seek()定位到c所在的文件指针位置,read()所需要的长度。
所以,综上所属,略写了一个函数如下:

In [35]: def readfiles_pos(start_key_chr,start_key_w,start_key_len):

    ...:  f = open('./arc.data','r')

    ...:  while True:

    ...:   r_cnt = f.read(1)

    ...:   if r_cnt == start_key_chr:

    ...:    r2_cnt = f.read(int(start_key_len)-1)

    ...:    if r2_cnt == start_key_w[1:]:

    ...: return f.tell()

    ...: break

新定义的函数readfiles_pos(),作用用于读取指定关键字,所在文件中的指针位置,并返回值。
需要传入的参数,定义如下:
start_key_w为需要查找的关键字内容,start_key_chr为需要查找的关键字内容的首字母,start_key_len为关键字内容的长度。

接下来,演示下执行调用过程:

// 查找起始字符串“Wxl”读取完后的位置,调用如下:

In [35]: readfiles('W','Wxl',3)  

Out[35]: 16

// 查找结束字符串“3Q8”的位置,调用如下:

In [27]: readfiles('3','3Q8',3) 

Out[27]: 1480

// 结束字符串“3Q8”的位置 - 起始字符串“Wxl”的位置 - 结束字符串“3Q8”的长度

In [32]: 1480-16-3      

Out[32]: 1461

// 调用seek(),将文件读取指针定位到起始字符串“Wxl”读取完后的位置,如下:

In [33]: f.seek(16) 

// 读取指定长度,结果如下:

In [34]: f.read(1461)

Out[34]: 'PSIgY29sb3I6IzNjM2IzYjtmb250LXNpemU6MTRweDsgYm9yZGVyOnNvbGlkrnIDFwe...

最后,谢谢这位同学,给予我的课程好评,当然也谢谢一直支持Jeson老师的朋友及同学们!


课程介绍:https://coding.imooc.com/class/160.html
课程问答区:https://coding.imooc.com/learn/qa/160.html

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/221888.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号