最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python連接HDFS實現(xiàn)文件上傳下載及Pandas轉(zhuǎn)換文本文件到CSV操作

 更新時間:2020年06月06日 08:39:25   作者:翱翔的江鳥  
這篇文章主要介紹了Python連接HDFS實現(xiàn)文件上傳下載及Pandas轉(zhuǎn)換文本文件到CSV操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

1. 目標

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

爬蟲和機器學習在Python中容易實現(xiàn)

在Linux環(huán)境下編寫Python沒有pyCharm便利

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

2. 實現(xiàn)

安裝Python模塊pyhdfs

版本:Python3.6, hadoop 2.9

讀文件代碼如下

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

寫文件代碼如下

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

上傳本地文件到HDFS

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

3. 讀取文本文件寫入csv

Python安裝pandas模塊

確認文本文件的分隔符

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

補充知識:記 讀取hdfs 轉(zhuǎn) pandas 再經(jīng)由pandas轉(zhuǎn)為csv的一個坑

工作流程是這樣的:

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

將讀取到的數(shù)據(jù)按 逗號 處理,變?yōu)橐粋€二維數(shù)組。

將二維數(shù)組傳給 pandas,生成 df。

經(jīng)若干處理后,將 df 轉(zhuǎn)為 csv 文件并寫入hdfs。

問題是這樣的:

正常的數(shù)據(jù):

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

三行數(shù)據(jù),正常走流程,沒有任何問題。

異常數(shù)據(jù):

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

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

為此,我的做法如下:

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

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

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

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

本來這樣做沒有什么問題,但是在經(jīng)由pandas轉(zhuǎn)為csv的時候,發(fā)現(xiàn)原來帶引號的字符串變?yōu)榱饲昂蟾鲙齻€引號。

源數(shù)據(jù):

處理后的數(shù)據(jù):

方法如下:

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

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

源數(shù)據(jù):

"[0.9653901649086855,0.03460983509131456]"

匹配替換后:

"[0.9653901649086855${dot}0.03460983509131456]"

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

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

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

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

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

再來個整體效果:

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

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

再次修改正則:

def split_by_dot_escape_quote(string):
  """
  按逗號分隔字符串,若其中有引號,將引號內(nèi)容視為整體
  """
  # 匹配引號中的內(nèi)容,非貪婪,采用正向肯定環(huán)視,
  # 當左引號(無論單雙引)被匹配到,放入組quote,
  # 中間的內(nèi)容任意,但是要用+?,非貪婪,且至少有一次匹配到字符,
  # 若*?,則匹配0次也可,并不會匹配任意字符(環(huán)視只匹配位置不匹配字符),
  # 由于在任意字符后面又限定了前面匹配到的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)))

運行結(jié)果如下:

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

以上這篇Python連接HDFS實現(xiàn)文件上傳下載及Pandas轉(zhuǎn)換文本文件到CSV操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MySQLdb ImportError: libmysqlclient.so.18解決方法

    MySQLdb ImportError: libmysqlclient.so.18解決方法

    這篇文章主要介紹了MySQLdb ImportError: libmysqlclient.so.18解決方法,需要的朋友可以參考下
    2014-08-08
  • tensorflow轉(zhuǎn)onnx的實現(xiàn)方法

    tensorflow轉(zhuǎn)onnx的實現(xiàn)方法

    本文主要介紹了tensorflow轉(zhuǎn)onnx的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • Python數(shù)據(jù)類型詳解(二)列表

    Python數(shù)據(jù)類型詳解(二)列表

    本文給大家詳細介紹的是Python數(shù)據(jù)類型中的列表(list),非常的簡單實用,有需要的小伙伴可以參考下
    2016-05-05
  • Python實現(xiàn)簡單的四則運算計算器

    Python實現(xiàn)簡單的四則運算計算器

    相信大家在學習數(shù)據(jù)結(jié)構(gòu)時,就學習了簡單四則運算表達式求解的一個算法,可惜一直沒有自己動手實現(xiàn)過這個算法。最近重拾數(shù)據(jù)結(jié)構(gòu)與算法,恰巧又正在用Python比較頻繁,所幸就用它來實現(xiàn)這個算法,雖然網(wǎng)上有很多代碼,不過作為一個學習者,還是應當親自動手實現(xiàn)。
    2016-11-11
  • python安裝教程

    python安裝教程

    這篇文章主要為大家詳細介紹了python安裝教程,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 基于Python繪制一個摸魚倒計時界面

    基于Python繪制一個摸魚倒計時界面

    前端時間推出了一個摸魚APP,這篇文章將為大家介紹基于Python繪制一個摸魚倒計時界面,文中的示例代碼講解詳細,感興趣的可以學習一下
    2021-12-12
  • Python?eval()?函數(shù)看這一篇就夠了

    Python?eval()?函數(shù)看這一篇就夠了

    eval(str)函數(shù)很強大,官方解釋為將字符串str當成有效的表達式來求值并返回計算結(jié)果,下面這篇文章主要給大家介紹了關(guān)于Python?eval()?函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • 使用python實現(xiàn)3D聚類圖示例代碼

    使用python實現(xiàn)3D聚類圖示例代碼

    這篇文章主要介紹了使用python實現(xiàn)3D聚類圖效果,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • python爬取新聞門戶網(wǎng)站的示例

    python爬取新聞門戶網(wǎng)站的示例

    短期目前旨在爬取所有新聞門戶網(wǎng)站的新聞,每個門戶網(wǎng)站爬蟲開箱即用,并自動保存到同目錄下的 csv/excel 文件中,禁止將所得數(shù)據(jù)商用。
    2021-04-04
  • Python腳本操作Excel實現(xiàn)批量替換功能

    Python腳本操作Excel實現(xiàn)批量替換功能

    這篇文章主要介紹了Python腳本操作Excel實現(xiàn)批量替換功能,本文使用的是Openpyxl工具,通過實例截圖給大家講解的非常詳細,需要的朋友可以參考下
    2019-11-11

最新評論

喀喇沁旗| 衡阳市| 宽甸| 甘洛县| 泾阳县| 南涧| 锡林郭勒盟| 巴彦淖尔市| 房山区| 班玛县| 任丘市| 鄱阳县| 海伦市| 高阳县| 安塞县| 承德市| 兰坪| 阳泉市| 时尚| 临猗县| 扶风县| 林西县| 岑巩县| 茌平县| 当涂县| 双城市| 兰州市| 普宁市| 蚌埠市| 绥江县| 汾西县| 桂平市| 龙井市| 达尔| 镇平县| 文成县| 波密县| 义乌市| 四川省| 峨山| 淮安市|