慕課小夥伴的一個問題,用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("hello
") #如果要寫入字元串以外的數據,先將他轉換為字元串.

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]: PSIgY29sb3I6IzNjM2IzYjtmb250LXNpemU6MTRweDsgYm9yZGVyOnNvbGlk
IDFwe...

最後,謝謝這位同學,給予我的課程好評,當然也謝謝一直支持Jeson老師的朋友及同學們!

課程介紹:coding.imooc.com/class/

課程問答區:coding.imooc.com/learn/

作者: Jeson老師

鏈接:imooc.com/article/24045

來源:慕課網


推薦閱讀:

【重磅】認證作者招募 | 打造個人品牌 so easy !

Python 面向對象(進階篇)

如何學習Python?

Python玩轉人工智慧最火框架TensorFlow應用實踐

面對人工智慧,我們應有的態度


推薦閱讀:

上班第6天:依舊不想上班!
被拒了N次的秋招還要繼續下去嗎?
升職為部門經理後,發現原先的同事不配合工作,該怎樣處理?
助理那些事兒 2
當公司出現這四種信號, 必須果斷辭職, 切勿猶豫!

TAG:Python | 職場 | Linux |