前言
Python用于處理文本數據絕對是個利器,極為簡單的讀取、分割、過濾、轉換支持,使得開發者不需要考慮繁雜的流文件處理過程(相對于JAVA來說的,嘻嘻)。博主自己工作中,一些復雜的文本數據處理計算,包括在HADOOP上編寫Streaming程序,均是用Python完成。
而在文本處理的過程中,將文件加載內存中是第一步,這就涉及到怎樣將文件中的某一列映射到具體的變量的過程,最最愚笨的方法,就是按照字段的下標進行引用,比如這樣子:
# fields是讀取了一行,并且按照分隔符分割之后的列表user_id = fields[0]user_name = fields[1]user_type = fields[2]
如果按照這種方式讀取,一旦文件有順序、增減列的變動,代碼的維護是個噩夢,這種代碼一定要杜絕。
本文推薦兩種優雅的方式來讀取數據,都是先配置字段模式,然后按照模式讀取,而模式則有字典模式和列表模式兩種形式;
讀取文件,按照分隔符分割成字段數據列表
首先讀取文件,按照分隔符分割每一行的數據,返回字段列表,以便后續處理。
代碼如下:
def read_file_data(filepath): '''根據路徑按行讀取文件, 參數filepath:文件的絕對路徑 @param filepath: 讀取文件的路徑 @return: 按/t分割后的每行的數據列表 ''' fin = open(filepath, 'r') for line in fin: try: line = line[:-1] if not line: continue except: continue try: fields = line.split("/t") except: continue # 拋出當前行的分割列表 yield fields fin.close()
使用yield關鍵字,每次拋出單個行的分割數據,這樣在調度程序中可以用for fields in read_file_data(fpath)
的方式讀取每一行。
映射到模型之方法1:使用配置好的字典模式,裝配讀取的數據列表
這種方法配置一個{“字段名”: 字段位置}的字典作為數據模式,然后按照該模式裝配讀取的列表數據,最后實現用字典的方式訪問數據。
所使用的函數:
@staticmethoddef map_fields_dict_schema(fields, dict_schema): """根據字段的模式,返回模式和數據值的對應值;例如 fields為['a','b','c'],schema為{'name':0, 'age':1},那么就返回{'name':'a','age':'b'} @param fields: 包含有數據的數組,一般是通過對一個Line String通過按照/t分割得到 @param dict_schema: 一個詞典,key是字段名稱,value是字段的位置; @return: 詞典,key是字段名稱,value是字段值 """ pdict = {} for fstr, findex in dict_schema.iteritems(): pdict[fstr] = str(fields[int(findex)]) return pdict
有了該方法和之前的方法,可以用以下的方式讀取數據:
# coding:utf8"""@author: www.crazyant.net測試使用字典模式加載數據列表優點:對于多列文件,只通過配置需要讀取的字段,就能讀取對應列的數據缺點:如果字段較多,每個字段的位置配置,較為麻煩"""import file_utilimport pprint # 配置好的要讀取的字典模式,可以只配置自己關心的列的位置dict_schema = {"userid":0, "username":1, "usertype":2}for fields in file_util.FileUtil.read_file_data("userfile.txt"): # 將字段列表,按照字典模式進行映射 dict_fields = file_util.FileUtil.map_fields_dict_schema(fields, dict_schema) pprint.pprint(dict_fields)
新聞熱點
疑難解答