电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Python連接HDFS實現文件上傳下載及Pandas轉換文本文件到CSV操作

瀏覽:3日期:2022-07-22 15:00:13

1. 目標

通過hadoop hive或spark等數據計算框架完成數據清洗后的數據在HDFS上

爬蟲和機器學習在Python中容易實現

在Linux環境下編寫Python沒有pyCharm便利

需要建立Python與HDFS的讀寫通道

2. 實現

安裝Python模塊pyhdfs

版本:Python3.6, hadoop 2.9

讀文件代碼如下

from pyhdfs import HdfsClientclient=HdfsClient(hosts=’ghym:50070’)#hdfs地址res=client.open(’/sy.txt’)#hdfs文件路徑,根目錄/for r in res: line=str(r,encoding=’utf8’)#open后是二進制,str()轉換為字符串并轉碼 print(line)

寫文件代碼如下

from pyhdfs import HdfsClientclient=HdfsClient(hosts=’ghym:50070’,user_name=’hadoop’)#只有hadoop用戶擁有寫權限str=’hello world’client.create(’/py.txt’,str)#創建新文件并寫入字符串

上傳本地文件到HDFS

from pyhdfs import HdfsClientclient = HdfsClient(hosts=’ghym:50070’, user_name=’hadoop’)client.copy_from_local(’d:/pydemo.txt’, ’/pydemo’)#本地文件絕對路徑,HDFS目錄必須不存在

3. 讀取文本文件寫入csv

Python安裝pandas模塊

確認文本文件的分隔符

# pyhdfs讀取文本文件,分隔符為逗號,from pyhdfs import HdfsClientclient = HdfsClient(hosts=’ghym:50070’, user_name=’hadoop’)inputfile=client.open(’/int.txt’)# pandas調用讀取方法read_tableimport pandas as pddf=pd.read_table(inputfile,encoding=’gbk’,sep=’,’)#參數為源文件,編碼,分隔符# 數據集to_csv方法轉換為csvdf.to_csv(’demo.csv’,encoding=’gbk’,index=None)#參數為目標文件,編碼,是否要索引

補充知識:記 讀取hdfs 轉 pandas 再經由pandas轉為csv的一個坑

工作流程是這樣的:

讀取 hdfs 的 csv 文件,采用的是 hdfs 客戶端提供的 read 方法,該方法返回一個生成器。

將讀取到的數據按 逗號 處理,變為一個二維數組。

將二維數組傳給 pandas,生成 df。

經若干處理后,將 df 轉為 csv 文件并寫入hdfs。

問題是這樣的:

正常的數據:

ZERO,MEAN,STD,CV,INC,OPP,CS,IS_OUTNET

0,9.233,2.445,0.265,1.202,241,1,0

0,8.667,1.882,0.217,1.049,179,1,0

三行數據,正常走流程,沒有任何問題。

異常數據:

ZERO,MEAN,STD,CV,INC,OPP,CS,IS_OUTNET,probability,prediction

0,9.233,2.445,0.265,1.202,241,1,0,’[0.9653901649086855,0.03460983509131456]’,0.0

0,8.667,1.882,0.217,1.049,179,1,0,’[0.9653901649086855,0.03460983509131456]’,0.0

在每一行中都會有一個數組類似的數據,有一對引號包起來,中間存在逗號,不可以拆分。

為此,我的做法如下:

匹配逗號是被成對引號包圍的字符串。

將匹配到的字符串中的逗號替換為特定字符。

將替換后的新字符串替換回原字符串。

在將原字符串中的特定字符串替換為逗號。

本來這樣做沒有什么問題,但是在經由pandas轉為csv的時候,發現原來帶引號的字符串變為了前后各帶三個引號。

源數據:

Python連接HDFS實現文件上傳下載及Pandas轉換文本文件到CSV操作

處理后的數據:

Python連接HDFS實現文件上傳下載及Pandas轉換文本文件到CSV操作

方法如下:

Python連接HDFS實現文件上傳下載及Pandas轉換文本文件到CSV操作

仔細研究對比了下數據,發現數據里的引號其實只是在純文本文件中用來標識其為字符串,并不應該存在于實際數據中。

Python連接HDFS實現文件上傳下載及Pandas轉換文本文件到CSV操作

而我每次匹配后都是原封不動替換回去,譬如:

源數據:

'[0.9653901649086855,0.03460983509131456]'

匹配替換后:

'[0.9653901649086855${dot}0.03460983509131456]'

這樣傳給pandas,它就會認為這個數據是帶引號的,在重新轉為csv的時候,就會進行轉義等操作,導致多出很多引號。

所以解決辦法就是在替換之前,將匹配時遇到的引號也去掉:

PATTERN = ’(?<=(?P<quote>[’']))([^,]+,[^,]+)+?(?=(?P=quote))’

中間 ([^,]+,[^,]+)+? 要用+?,因為必須確定是有這樣的組合才可以,并且非貪婪模式,故不可 ? 或者 *?

Python連接HDFS實現文件上傳下載及Pandas轉換文本文件到CSV操作

(ps:為了方便后面引用前面的匹配,我在環視匹配中創建了一個組)

再來個整體效果:

Python連接HDFS實現文件上傳下載及Pandas轉換文本文件到CSV操作

為了說明效果,引用pandas的自帶讀取csv方法:

Python連接HDFS實現文件上傳下載及Pandas轉換文本文件到CSV操作

可以看到pandas讀取出的該位置數據也是字符串,引號正是作為一個字符串聲明而存在。

再次修改正則:

def split_by_dot_escape_quote(string): ''' 按逗號分隔字符串,若其中有引號,將引號內容視為整體 ''' # 匹配引號中的內容,非貪婪,采用正向肯定環視, # 當左引號(無論單雙引)被匹配到,放入組quote, # 中間的內容任意,但是要用+?,非貪婪,且至少有一次匹配到字符, # 若*?,則匹配0次也可,并不會匹配任意字符(環視只匹配位置不匹配字符), # 由于在任意字符后面又限定了前面匹配到的quote,故只會匹配到', # +?則會限定前面必有字符被匹配,故'',或引號中任意值都可匹配到 pattern = re.compile(’(?=(?P<quote>[’'])).+?(?P=quote)’) rs = re.finditer(pattern, string) for data in rs: # 匹配到的字符串 old_str = data.group() # 將匹配到的字符串中的逗號替換為特定字符, # 以便還原到原字符串進行替換 new_str = old_str.replace(’,’, ’${dot}’) # 由于匹配到的引號僅為字符串申明,并不具有實際意義, # 需要把匹配時遇到的引號都去掉,只替換掉當前匹配組的引號 new_str = re.sub(data.group(’quote’), ’’, new_str) string = string.replace(old_str, new_str) sps = string.split(’,’) return map(lambda x: x.replace(’${dot}’, ’,’), sps) s = ’'2011,603','3510006998','F','5','5','0',''’print(list(split_by_dot_escape_quote(s)))

運行結果如下:

Python連接HDFS實現文件上傳下載及Pandas轉換文本文件到CSV操作

之前想的正則有些復雜,反而偏離了本意,還是對正則的認識不夠深。

以上這篇Python連接HDFS實現文件上傳下載及Pandas轉換文本文件到CSV操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 温州中研白癜风专科_温州治疗白癜风_温州治疗白癜风医院哪家好_温州哪里治疗白癜风 | 浙江自考_浙江自学考试网 | 安驭邦官网-双向万能直角铣头,加工中心侧铣头,角度头[厂家直销] 闸阀_截止阀_止回阀「生产厂家」-上海卡比阀门有限公司 | 找果网 | 苹果手机找回方法,苹果iPhone手机丢了找回,认准找果网! | 长沙发电机-湖南发电机-柴油发电机供应厂家-长沙明邦智能科技 | 西门子气候补偿器,锅炉气候补偿器-陕西沃信机电工程有限公司 | 集装箱箱号识别_自重载重图像识别_铁路车号自动识别_OCR图像识别 | 合金ICP光谱仪(磁性材料,工业废水)-百科 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 一航网络-软件测评官网 | 网优资讯-为循环资源、大宗商品、工业服务提供资讯与行情分析的数据服务平台 | 洗瓶机厂家-酒瓶玻璃瓶冲瓶机-瓶子烘干机-封口旋盖压盖打塞机_青州惠联灌装机械 | 乐之康护 - 专业护工服务平台,提供医院陪护-居家照护-居家康复 | 北京中航时代-耐电压击穿试验仪厂家-电压击穿试验机 | 旗帜网络笔记-免费领取《旗帜网络笔记》电子书 | 层流手术室净化装修-检验科ICU改造施工-华锐净化工程-特殊科室建设厂家 | 烟台条码打印机_烟台条码扫描器_烟台碳带_烟台数据采集终端_烟台斑马打印机-金鹏电子-金鹏电子 | 喷码机,激光喷码打码机,鸡蛋打码机,手持打码机,自动喷码机,一物一码防伪溯源-恒欣瑞达有限公司 | 春腾云财 - 为企业提供专业财税咨询、代理记账服务 | 电力测功机,电涡流测功机,磁粉制动器,南通远辰曳引机测试台 | PCB接线端子_栅板式端子_线路板连接器_端子排生产厂家-置恒电气 喷码机,激光喷码打码机,鸡蛋打码机,手持打码机,自动喷码机,一物一码防伪溯源-恒欣瑞达有限公司 假肢-假肢价格-假肢厂家-河南假肢-郑州市力康假肢矫形器有限公司 | 杭州荣奥家具有限公司-浙江办公家具,杭州办公家具厂 | 无尘烘箱_洁净烤箱_真空无氧烤箱_半导体烤箱_电子防潮柜-深圳市怡和兴机电 | 工控机,嵌入式主板,工业主板,arm主板,图像采集卡,poe网卡,朗锐智科 | 热回收盐水机组-反应釜冷水机组-高低温冷水机组-北京蓝海神骏科技有限公司 | 酒瓶_酒杯_玻璃瓶生产厂家_徐州明政玻璃制品有限公司 | 智能气瓶柜(大型气瓶储存柜)百科 | 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 翻斗式矿车|固定式矿车|曲轨侧卸式矿车|梭式矿车|矿车配件-山东卓力矿车生产厂家 | 橡胶接头_橡胶软接头_套管伸缩器_管道伸缩器厂家-巩义市远大供水材料有限公司 | 结晶点测定仪-润滑脂滴点测定仪-大连煜烁 | arch电源_SINPRO_开关电源_模块电源_医疗电源-东佑源 | RV减速机-蜗轮蜗杆减速机-洗车机减速机-减速机厂家-艾思捷 | 铝镁锰板厂家_进口钛锌板_铝镁锰波浪板_铝镁锰墙面板_铝镁锰屋面-杭州军晟金属建筑材料 | 企业VI设计_LOGO设计公司_品牌商标设计_【北京美研】 | 校服厂家,英伦校服定做工厂,园服生产定制厂商-东莞市艾咪天使校服 | 慈溪麦田广告公司,提供慈溪广告设计。| 企业微信营销_企业微信服务商_私域流量运营_艾客SCRM官网 | 乐考网-银行从业_基金从业资格考试_初级/中级会计报名时间_中级经济师 | 电磁流量计_智能防腐防爆管道式计量表-金湖凯铭仪表有限公司 | MES系统工业智能终端_生产管理看板/安灯/ESOP/静电监控_讯鹏科技 |