實用小工具,教你輕鬆轉化Python通用數據格式

2021-03-02 CDA數據分析師
已獨立成項目在github上面 dataformat,在進行hadoop測試時,需要造大量數據,例如某個表存在56列,但實際程序邏輯只適用到某幾列,我們造的數據 也只需要某幾列#this script change data from your source to the dest data format#2011-08-05 created version0.1#2011-10-29 add row-row mapping ,default row value .rebuild all functions. version0.2#next:add data auto generate by re expression#2011-12-17 add new functions, add timestamp creator. version0.3#2012-03-08 rebuild functions. version0.4#2012-06-22 add function to support multi output separators#2012-07-11 fix bug line 44,add if#2012-09-03 rebuild functions,add help msg! version0.5#2012-11-08 last version edited by lingyue.wkl# this py: https://github.com/wklken/pytools/blob/master/data_process/dataformat.py#read file and get each line without nreturn [line[:-1] for line in lines ]def one_line_proc(parts, total, ft_map, outsp, empty_fill, fill_with_sno):for i in range(1, total + 1): #加入使用默認值列 若是以d開頭,後面是默認,否則取文件對應列 done if fill_index.startswith("d"): outline.append(fill_index[1:]) outline.append(handler_specal_part(parts[int(fill_index) - 1])) outline.append(empty_fill)default_outsp = outsp.get(0,"t") result.append(outline[i]) result.append(outsp.get(i + 1, default_outsp))def process(inpath, total, to, outpath, insp, outsp, empty_fill, fill_with_sno, error_line_out): if r":" not in to_row and len(to_row.split(":")) == 2: used_row.append(int(to_row.split(":")[1])) if r"=" not in str(to_row) and len(str(to_row).split("=")) == 2: if r"=" not in str(to_row) and len(str(to_row).split("=")) == 2: ft_map.update({int(to_row.split("=")[0]): "d"+to_row.split("=")[1]}) elif r":" not in to_row and len(to_row.split(":")) == 2: ft_map.update({int(to_row.split(":")[0]): to_row.split(":")[1]}) for i in range(1, total + 1): ft_map.update({int(to_row): str(to_index)}) used_row.append(to_index)#setp3 處理輸出分隔符 outsp 0=t,1= 0代表默認的,其他前面帶列號的代表指定的if len(outsp) > 1 and len(outsp.split(",")) > 1: outsps = re.findall(r"d=.+?", outsp) k,v = outsp_kv.split("=") outsp.update({int(k): v})lines = read_file(inpath) if len(insp.split("|")) > 0: parts = re.split(insp, line) if len(parts) >= in_count: outline = one_line_proc(parts, total, ft_map, outsp, empty_fill, fill_with_sno) result.append(outline + "n") result.append(line + "n")#特殊的處理入口,處理維度為每一行,目前只有時間處理def handler_specal_part(part_str):if part_str.startswith("TS") and "=" in part_str: ts_format = {8: "%Y%m%d", #step1 確認輸出的格式 TS8 TS10 TS14 TS19 to_l = int(part_str[2:part_str.index("=")]) part_str = part_str.split("=")[1].strip() inputdate = part_str.split("+")[0].strip() interval = int(part_str.split("+")[1].strip()) parts = part_str.split("-") if len(parts) == 2: #20101020 - XX inputdate = parts[0].strip() interval = -int(parts[1].strip()) elif len(parts) == 3: #2010-10-20 elif len(parts) == 4: #2010-10-20 - XX inputdate = "-".join(parts[:-1]) interval = -int(parts[-1]) inputdate = part_str.strip() part_str = get_timestamp(inputdate, ts_format, interval) #step4 如果定義了輸出格式,轉換成目標格式,返回 part_str = time.strftime(ts_format.get(to_l), time.localtime(int(part_str)))def get_timestamp(inputdate, ts_format, interval=0): inputdate = time.strftime("%Y%m%d%H%M%S")inputdate = inputdate.strip() ts = time.strptime(inputdate, ts_format.get(size)) print "the input date and time expression error,only allow 'YYYYmmdd[HHMMSS]' or 'YYYY-MM-DD HH:MM:SS' " print "the input date and time expression error,only allow 'YYYYmmdd[HHMMSS]' or 'YYYY-MM-DD HH:MM:SS' "return str(int(time.mktime(ts)) + interval)print("功能:原數據文件轉為目標數據格式")print("t -i inputfilepath [必輸,input, 原文件路徑]")print("t -t n [必輸,total, n為數字,目標數據總的域個數]")print("t -a '1,3,4' [必輸,array, 域編號字符串,逗號分隔。指定域用原數據欄位填充,未指定用'0'填充]")print("t -a '3,5=abc,6:2' 第5列默認值abc填充,第6列使用輸入的第1列填充,第3列使用輸入第1列填充")print("t -o outputfilepath [可選,output, 默認為 inputfilepath.dist ]")print("t -F 'FS' [可選,field Sep,原文件域分隔符,默認為\t,支持多分隔符,eg.'t|||' ]")print("t -P 'OFS' [可選,out FS,輸出文件的域分隔符,默認為\t,可指定多個,多個需指定序號=分隔符,逗號分隔,默認分隔符序號0 ]")print("t -f 'fill_str' [可選,fill,未選列的填充值,默認為空 ]")print("t -s [可選,serial number,當配置時,-f無效,使用列號填充未指派的列]")print("t -e [可選,error, 源文件列切分不一致行/空行/注釋等,會被直接輸出,正確行按原邏輯處理]")def must_be_defined(param, map, error_info): opts,args = getopt.getopt(sys.argv[1:],"F:P:t:a:i:o:f:hse") if op in ("-h", "-H", "--help"): insp = value.decode("string_escape") outsp = value.decode("string_escape") print(sys.argv[0]+" : the amount of params must great equal than 3") print("Command : ./dataformat.py -h")except getopt.GetoptError: print(sys.argv[0]+" : params are not defined well!") print("Command : ./dataformat.py -h")must_be_defined('inpath', params_map, sys.argv[0]+" : -i param is needed,input file path must define!")must_be_defined('total', params_map, sys.argv[0]+" : -t param is needed,the fields of result file must define!")must_be_defined('to', params_map, sys.argv[0]+" : -a param is needed,must assign the field to put !")if not os.path.exists(inpath): print(sys.argv[0]+" file : %s is not exists"%inpath)if 'outpath' not in dir():process(inpath, total, to, outpath, insp, outsp, empty_fill, fill_with_sno, error_line_out)if __name__ =="__main__":功能:可指定輸入分隔,輸出分隔,無配置欄位填充,某列默認值,可按順序填充,也可亂序映射填充./dataformat.py –i in_file –t 65 -a 「22,39,63」 –F 「^I」 –P 「^A」 –f 「0」in_file中欄位是以t分隔的[可不配-F,使用默認]。將in_file的第1,2,3列分別填充到in_file.dist[use default]的第22,39,63列in_file.dist共65列,以^A分隔,未配置列以0填充-a中順序與源文件列序有關,若-a 「39,22,63」 則是將第1列填充到第39列,第二列填充到22列,第3列填充到63列【需要對某些列填充相同的值,但不想在源文件中維護】
./dataformat.py -i in_file –t 30 –a 「3=tag_1,9,7,12=0.0」 –o out_filein_file以t分隔,輸出out_file以t分隔將in_file的第1列,第2列填充到out_file的第9列,第7列out_file共30列,第3列均用字符串」tag_1」填充,第12列用0.0填充,其他未配置列為空注意:默認值 的取值,若是使用到等號和冒號,需轉義,加 = :./dataformat.py –i in_file –t 56 –a 「3:2,9,5:3,1=abc,11」目標文件第3列用輸入文件第2列填充,目標文件第5列用輸入文件第3列填充目標文件第9列用輸入文件第1列填充,第11列用輸入文件第4列填充【未配置映射,使用從頭開始還沒有被用過的列】腳本會對簡單的欄位數量等映射邏輯進行檢測,複雜最好全配上,使用默認太抽象本文連結:http://python.jobbole.com/83447/點擊文章底部閱讀原文,查看CDA數據分析師認證考試考綱解析和報名流程。


回復關鍵字 看往期精彩~

1001 ☛ 一分鐘讀懂2015中國數據分析師行業峰會!

1002 ☛ 吳喜之:數據分析和數據挖掘是最大的求職法寶

1003 ☛ 33道Hadoop面試題,看看你能答對多少?(答案在後面)

1004 ☛ 成為首席數據官是一種什麼樣的體驗?

1005 ☛ 超能教程 十分鐘學會 Python!


相關焦點

  • 開發一個文章簡繁體轉化的小工具(附python代碼)
    今天給大家安利一款簡體繁體轉換的一個工具包,非常好用。普通人的操作一般,我們會用WPS進行簡繁體轉換。選中文本,點擊「審閱」,就可以選擇「繁轉簡」或者「簡轉繁」。如果老闆給你一百篇文章,甚至給你一千篇文章,需要簡繁體轉化,該怎麼做?會編程的人參照以往項目的風格,大家一定會知道,可以用編程實現批量處理。哪怕是一百萬篇文章,只要一份代碼就能輕鬆鬆搞定。
  • 實用小工具(python or php實現)
    如果數據量小手動分割下就好了,如果數據量很大的話手動完成實在太耗費人力了,也不現實。那麼就需要藉助腳本去實現。既然有朋友想簡單的完成這個任務,那麼不如記錄下來,給需要的朋友提供方便。A.txt文件為要分割的測試數據,我創建了21條數據,如下:
  • 數據分析:基於Python的自定義文件格式轉換系統
    其中結構化數據以規範的文檔、資料庫文件等等為代表;半結構化數據以網頁、json文件等為代表;非結構化數據以自由文本為主,諸如隨想錄、中醫病症記錄等等。遺憾的是現實生活中半結構化和非結構化數據居多,而且往往還需要自己去收集。       讀者試想以下情況:你的技術主管交給你一堆數據文件,讓你做數據分析工作。
  • python數據處理 | 氣象數據的常用格式以及處理方法
    這次我們來簡單了解下氣象數據常用的格式以及處理的工具,常用的數據格式包括普通的二進位格式、文本數據、NetCDF、HDF4/5以及GRIB1/2數據。我們可以利用程式語言例如python、matlab以及c語言,根據數據的說明文檔或者相應的數據api開發文檔進行讀取,此外我們也可以根據提供的command命令行進行高效提取數據。
  • BIOM:生物觀測矩陣——微生物組數據通用數據格式
    我們主要了解以下三方面的內容:BIOM文件格式的定義;biom命令對文件格式的轉換、添加元數據、總結等;使用Python和R操作BIOM文件biom工具安裝常用的biom操作工具是一個python包,可通過pip、conda等安裝# 安裝依賴關系科學計算包pip install numpy# 安裝biom包pip
  • RION——一種快速、緊湊、通用的數據格式
    來源:Pexels原始網際網路對象符號(RION)是一種快速、緊湊、通用的數據格式。你可能會想:「又一個數據格式。」實際上,我們使用RION作為網絡協議的消息編碼和數據流存儲引擎的記錄格式。因此,我們對RION的數據交換和數據存儲進行了壓力測試。通用的數據格式從一開始,我們想使RION儘可能的通用化,這意味著可以對多種結構化數據進行編碼。
  • 將Python中的字典數據轉化為DataFrame
    就一般而言,如果遇到了簡單的數據源,可知通過下面的三步實施:確定數據要留言數據的格式,從而確定是否能夠用於本文所說的過程。比如下面的數據:我們需要做的是把這個表格樣式的數據,用Python的字典表示——數據量小,不費事。
  • 大數據下Python的三款大數據分析工具
    在本文中,我們準備討論三個關於Python在大數據方面處理的工具,可以幫助大家在產品層面提升大數據編程的技術。背景在本文中,我使用了virtualenv,pyenv,你也可以使用其它環境或本地的Python均可。
  • python數據分析專題 (7):python數據分析模塊
    也就是這些python的擴展包讓python可以做數據分析,主要包括numpy,scipy,pandas,matplotlib,scikit-learn等等諸多強大的模塊,在結合上ipython交互工具 ,以及python強大的爬蟲數據獲取能力,字符串處理能力,讓python成為完整的數據分析工具。
  • [原]深入對比數據科學工具箱:Python和R 非結構化數據的結構化
    概述在現實場景中,由於數據來源的異構,數據源的格式往往是難以統一的,這就導致大量具有價值的數據通常是以非結構化的形式聚合在一起的由於MongoDB自身是一個文檔型資料庫,一方面,MongoDB 並沒有事務的概念,所以在需要保證數據一致性的場景下並不好用。另一方面,MongoDB的join查詢也沒有RDBMS來得直觀方便,所以在需要多表關聯查詢的場景下也非常捉急。通常,對於小數據集,我們都會將數據導入到類似MySQL這樣的RDBMS中做進一步的結構化處理,對於大數據集則可以通過Hive導入到HDFS上。
  • 這幾個常用的python庫你需要知道
    python可以說是近幾年最火熱、最實用的、最容易上手的工具之一了。功能強大、應用廣泛,可以幫你搜集工作數據,還能幫你下載音樂,電影,於是就掀起了一波學習python的大潮,小編也毫不猶豫的加入了。但是對於向小編一樣的小白來說,剛開始學習還是有些困難的,需要首先了解python的一些基礎知識。所以小編就整理了一些常用的python庫,希望對正在學習python的小夥伴有所幫助。1.MatplotlibMatplotlib是一個用於創建二維圖和圖形的底層庫。藉由它的幫助,你可以構建各種不同的圖標,從直方圖和散點圖到費笛卡爾坐標圖。
  • 基於Python實現對各種數據文件的操作
    常見的數據文件類型如下:txtcsvexcel(xls\xlsx)在線網頁數據pdf\word其他數據軟體格式1 txt文件更多參考:https://docs.python.org/3/tutorial/inputoutput.html
  • Biopython-- 免費強大簡潔的生物信息學工具
    作者:Lancelot排版,審核:愷忻Biopython是一款為計算分子生物學開發的工具
  • 如何利用Python處理JSON格式的數據,建議收藏!!!
    數據分析與籃球JSON數據格式在我們的日常工作中經常會接觸到,無論是做爬蟲開發還是一般的數據分析處理,今天,小編就來分享一下當數據接口是JSON格式時,如何進行數據處理進行詳細的介紹,內容分布如下JSON(JavaScript Object Notation, JS對象簡譜)是一種輕量級的數據交換格式,通常是以鍵值對的方式呈現,其簡潔和清晰的層次結構使得
  • Python可視化庫解析
    1.matplotlibMatplotlib是一個Python 2維繪圖庫,已經成為python中公認的數據可視化工具,通過Matplotlib你可以很輕鬆地畫一些或簡單或複雜地圖形,幾行代碼即可生成線圖、直方圖、功率譜、條形圖、錯誤圖、散點圖等等。
  • n種方式教你用python讀寫excel等數據文件
    點擊上方「濤哥聊Python」,選擇「星標」公眾號重磅乾貨,第一時間送達來源:Python大數據分析python處理數據文件的途徑有很多種,可以操作的文件類型主要包括文本文件(csv、txt、json等)、excel
  • 非常好用的圖片格式轉化工具
    現在網上有很多的圖片處理工具,這裡我推薦一款好用免費的officebox包含的《全能圖片轉化工具》,可以實現自由多種常見圖片格式的轉換,無需支付任何費用,不含恩和插件病毒,直接導入圖片,支持自定義轉換為圖片格式,質量,大小,以及輸出文件名稱和保存路徑,一建轉化為多個圖片。
  • EXCEL函數TEXT,格式轉化的利器
    EXCEL中的TEXT函數,可以將數字,日期轉換為需要的文本格式,在實際的應用當中比較的實用,相關的應用中可以與單元格的格式設置媲美。下面以相關的實例來看看TEXT函數的應用。語法:TEXT(Value, Format_Text)轉化數據格式的案例實用「0.00」格式化數據,保留數據的小數點後兩位。使用公式:=TEXT(B4,C4),該公式相當於為:=TEXT(3.141593,"0.00")使用「#.
  • n種方式教你用Python讀寫Excel等數據文件
    下面整理下python有哪些方式可以讀寫數據文件。1. read、readline、readlinesread()  :一次性讀取整個文件內容。推薦使用read(size)方法,size越大運行時間越長readline()  :每次讀取一行內容。
  • 使用Python處理NetCDF格式文件
    在地球科學領域使用較為廣泛,大多數數值模式,衛星,雷達等數據格式通常為NetCDF格式。本文不對NetCDF數據格式進行過多的介紹,主要講一下如何處理NetCDF格式文件,並且如何對最終的數據進行可視化分析。