Python HDFS 연결 파일 업로드 및 Pandas CSV 로 텍스트 파일 변환
hadop hive 나 spark 등 데이터 계산 프레임 워 크 를 통 해 데이터 세척 을 마 친 데 이 터 는 HDFS 에 있 습 니 다.
파충류 와 기계 학습 은 Python 에서 쉽게 이 루어 집 니 다.
Linux 환경 에서 Python 을 만 드 는 것 은 pyCharm 이 편리 하지 않 습 니 다.
Python 과 HDFS 의 읽 기와 쓰기 채널 을 만들어 야 합 니 다.
2.실현
Python 모듈 pyhdfs 설치
파 이 썬 3.6,hadop 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()
print(line)
파일 코드 는 다음 과 같 습 니 다.
from pyhdfs import HdfsClient
client=HdfsClient(hosts='ghym:50070',user_name='hadoop')# hadoop
str='hello world'
client.create('/py.txt',str)#
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 read_table
import pandas as pd
df=pd.read_table(inputfile,encoding='gbk',sep=',')# , ,
# to_csv csv
df.to_csv('demo.csv',encoding='gbk',index=None)# , ,
보충 지식:hdfs 를 읽 고 pandas 를 거 쳐 csv 로 전환 하 는 구덩이작업 절 차 는 다음 과 같다.
hdfs 의 csv 파일 을 읽 습 니 다.hdfs 클 라 이언 트 가 제공 하 는 read 방법 을 사용 합 니 다.이 방법 은 생 성 기 를 되 돌려 줍 니 다.
읽 은 데 이 터 를 쉼표 로 처리 하여 2 차원 배열 로 바 꿉 니 다.
2 차원 배열 을 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 로 바 뀌 었 을 때,원래 따옴표 가 있 던 문자열 이 앞 뒤로 세 개의 따옴표 가 있 는 것 을 발견 하 였 다.
원본 데이터:
처리 한 데이터:
방법 은 다음 과 같다.
데 이 터 를 자세히 연구 한 결과 데이터 에 있 는 따옴표 가 순수한 텍스트 파일 에서 문자열 로 표 시 될 뿐 실제 데이터 에 존재 하지 말 아야 한 다 는 것 을 발견 했다.
그리고 나 는 매 칭 할 때마다 그대로 바 뀌 었 다.예 를 들 어:
원본 데이터:
"[0.9653901649086855,0.03460983509131456]"
일치 교체 후:
"[0.9653901649086855${dot}0.03460983509131456]"
이렇게 pandas 에 전달 하면 이 데 이 터 는 따옴표 가 있 는 것 이 라 고 생각 하고 csv 로 다시 전환 할 때 전의 등 조작 을 하여 많은 따옴표 가 생 긴 다.
따라서 해결 방법 은 교체 하기 전에 일치 하 는 따옴표 도 제거 하 는 것 입 니 다.
PATTERN = '(?<=(?P
[\'\"]))([^,]+,[^,]+)+?(?=(?P=quote))'
중간([^,]+,[^,]+)+?+?이런 조합 이 있 는 지 확인 해 야 하고 탐욕 모델 이 아니 기 때문에 안 된다?아니면
(ps:앞 에 있 는 매 칭 을 편리 하 게 참조 하기 위해 서,나 는 둘 러 보기 매 칭 에서 그룹 을 만 들 었 습 니 다)
전체 효과 추가:
효 과 를 설명 하기 위해 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)))
이전에 생각 한 정칙 은 좀 복잡 하 였 으 나,오히려 본의 에서 벗 어 났 으 며,여전히 정칙 에 대한 인식 이 깊 지 않다.
이 파 이 썬 은 HDFS 에 연결 하여 파일 업로드 및 다운로드 및 Pandas 에서 텍스트 파일 을 CSV 로 변환 하 는 작업 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.참고 하 시기 바 랍 니 다.많은 응원 부탁드립니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.