2016-06-19 4 views
0

텍스트 파일이 있습니다. 그것의 용기는 다음과 같이/그것의 모든 다음과 같다 내가 파이썬 2 세트에 이러한 값을 넣어 어떻게, 어쨌든파이썬 - 텍스트 파일에서 세트 만들기

(0, 16, 0) 
(0, 17, 0) 
(0, 18, 0) 
(0, 19, 0) 
(0, 20, 0) 
(0, 21, 0) 
(0, 22, 0) 
(0, 22, 1) 
(0, 22, 2) 
(0, 23, 0) 
(0, 23, 4) 
(0, 24, 0) 
(0, 25, 0) 
(0, 25, 1) 
(0, 26, 0) 
(0, 26, 3) 
(0, 26, 4) 
(0, 26, 5) 
(0, 26, 9) 
(0, 27, 0) 
(0, 27, 1) 

(편집되었습니다. 이것은 처음처럼 보였다하지 무엇도했다) ?

내 가장 최근의 시도는

om_set = set(open('Rye Grass.txt').read() 

편집 :이 내가 내 텍스트 파일을 가져 오는 데 사용하는 코드입니다. modification.You이 시도 할 수 NP 수입 시간으로 수입 CV2 수입 NumPy와는

om=cv2.imread('spectrum1.png') 
om=om.reshape(1,-1,3) 
om_list=om.tolist() 
om_tuple={tuple(item) for item in om_list[0]} 
om_set=set(om_tuple) 

im=cv2.imread('1.jpg')   
im=cv2.resize(im,(100,100))   
im= im.reshape(1,-1,3) 
im_list=im.tolist() 
im_tuple={tuple(item) for item in im_list[0]} 
ColourCount= om_set & set(im_tuple) 
with open('Weedlist', 'a') as outputfile: 
    output = ', '.join([str(tup) for tup in sorted(ColourCount)]) 
    outputfile.write(output) 
print 'done' 

im=cv2.imread('2.jpg')   
im=cv2.resize(im,(100,100))   
im= im.reshape(1,-1,3) 
im_list=im.tolist() 
im_tuple={tuple(item) for item in im_list[0]} 
ColourCount= om_set & set(im_tuple) 
with open('Weedlist', 'a') as outputfile: 
    output = ', '.join([str(tup) for tup in sorted(ColourCount)]) 
    outputfile.write(output) 
print 'done' 
+0

가장 최근의 시도는 om_set = set (open ('Rye Grass.txt'))입니다.) –

+1

파일 내용을 파싱해야합니다.'file.read()'는 모든 것을 긴 문자열로 읽어 들이고,'set()'을 호출하면 모든 문자 집합을 가져옵니다. 그것을 파싱하기 위해서는 정확한 구조가 알려 져야한다. (단지 "헛된 것"이 아니다.) 항상 쉼표로 구분 된 정수의 세 쌍임? –

+0

쉼표로 구분 된 정수의 세 쌍은 항상 픽셀 값이다. –

답변

1

제안 만 괄호로 둘러싸인 쉼표로 구분 된 세 쌍둥이에 정수의 이러한 고정 된 표현을 가지고 파일을 신뢰 한 가지의 간단한 파서 (OP의 질문은 파일의 탐욕 "읽기"를했다) memors로 :

#! /usr/bin/env python 
from __future__ import print_function 


infile = 'pixel_int_tuple_reps.txt' 
split_pits = None 
with open(infile, 'rt') as f_i: 
    split_pits = [z.strip('()') for z in f_i.read().strip().split('),')] 
if split_pits: 
    on_set = set(tuple(int(z.strip()) 
       for z in tup.split(', ')) for tup in split_pits) 

    print(on_set) 

tramsforms :

(0, 19, 0), (0, 20, 0), (0, 21, 1), (0, 22, 0), (0, 24, 3), (0, 27, 0), (0, 29, 2), (0, 35, 2), (0, 36, 1) 

로 :

,
set([(0, 27, 0), (0, 36, 1), (0, 21, 1), (0, 22, 0), (0, 24, 3), (0, 19, 0), (0, 35, 2), (0, 29, 2), (0, 20, 0)]) 

작은 니펫

  1. 가 부유 괄호 및 스페이스 떨어진 비트 세정 (또한 끝에서 폐쇄 괄호 돌보는 0, 19, 0의 문자열로 화소 정수 트리플렛을 분할한다.

  2. "작업 한"경우 - 또한 정수 변환 튜플을 사용하여 rgb 분할을 세트로 공급합니다.

그런 직렬화 작업에서 eval/exec를 사용하기 전에 실제로 두 번 생각할 것입니다.

업데이트 OP 의견에 의해 제안 (질문을 업데이트하십시오!) :

  1. 영업의 사이트에있는 파일 (메모리에 계속) 인쇄가 너무 큰 것 같다? (가) 문제의 광고로
  2. 그것은 ...,

작성 하지입니다 ...그래서 우리가 OP에서 추가 정보를 얻을 때까지 :

이론적으로 깨끗한 3-int-tuple 덤프 파일의 경우이 대답은 작동하지 않습니다 (한번에로드하고 세트로 매핑하기에는 너무 크지 않은 경우). 충분한 새로운 정보 질문 ;-)

한 가지 방법에 추가 된 경우 트리플 "라인"또는 줄 바꿈없이 이전 단계에서 concat이면

콘크리트 작업에 대한

, 나는 대답을 업데이트 할 수 있습니다 분리하지만, 쉼표 누락 alwayss, 부분 중 하나를 읽는 파일을 변경 : (줄 바꿈은 별도의 경우) 라인 기반 리더기에

  1. 를 항상 새가 설정 수확의 조합을 루프로 설정 생성을 당겨 과 같은 기존의 (누적 된) 것은 "격리"에서 그들을 다루고 있습니다
  2. 이들 "덩어리"만약 1,363,210 그렇게 (0, 1, 230)(13, ...)( "하드 타격"되는 것처럼 추가됩니다

    <안녕, 시작 = "2">
  3. 기존 코드 판독기 내부 대신의 수정 : f_i.read().strip().split('),') 쓰기 f_i.read().replace(')('), (', ').strip().split('),')을 ... ), ( 부분에 )( 부분을 "고정"하여 동질성 "구조"인 것처럼 계속할 수 있습니다.

업데이트 이제 데이터 세트의 버전 2를 파싱 (업데이트 질문) :

파일 pixel_int_tuple_reps_v2.txt 이제이 있습니다

(0, 16, 0) 
(0, 17, 0) 
(0, 18, 0) 
(0, 19, 0) 
(0, 20, 0) 
(0, 21, 0) 
(0, 22, 0) 
(0, 22, 1) 
(0, 22, 2) 
(0, 23, 0) 
(0, 23, 4) 
(0, 24, 0) 
(0, 25, 0) 
(0, 25, 1) 
(0, 26, 0) 
(0, 26, 3) 
(0, 26, 4) 
(0, 26, 5) 
(0, 26, 9) 
(0, 27, 0) 
(0, 27, 1) 

코드 :

#! /usr/bin/env python 
from __future__ import print_function 


infile = 'pixel_int_tuple_reps_v2.txt' 
on_set = set() 
with open(infile, 'rt') as f_i: 
    for line in f_i.readlines(): 
     rgb_line = line.strip().lstrip('(').rstrip(')') 
     try: 
      rgb = set([tuple(int(z.strip()) for z in rgb_line.split(', '))]) 
      on_set = on_set.union(rgb) 
     except: 
      print("Ignored:" + rgb_line) 
      pass 
print(len(on_set)) 
for rgb in sorted(on_set): 
    print(rgb) 

지금 구문 분석 이 파일은 먼저 집합의 길이를 덤프하고 (요소 정렬 순서대로) :

21 
(0, 16, 0) 
(0, 17, 0) 
(0, 18, 0) 
(0, 19, 0) 
(0, 20, 0) 
(0, 21, 0) 
(0, 22, 0) 
(0, 22, 1) 
(0, 22, 2) 
(0, 23, 0) 
(0, 23, 4) 
(0, 24, 0) 
(0, 25, 0) 
(0, 25, 1) 
(0, 26, 0) 
(0, 26, 3) 
(0, 26, 4) 
(0, 26, 5) 
(0, 26, 9) 
(0, 27, 0) 
(0, 27, 1) 

HTH. 제공된 샘플 입력에는 중복이 없습니다. 마지막 데이터 라인을 두 배로 늘림 나는 아직도 21 개의 고유 한 요소를 출력으로 받았으므로 설계된대로 작동합니다 .-

+0

이것은 꽤 큰 세트 파일입니다 ... 나는 그것을 인쇄 할 수 없을 것입니다 ... 만약 내가 방금 "len (on_set"을 시험해 보겠다고 말하면 어떨까요?) –

+0

Traceback (최근 호출 마지막) : File "C : \ Users \ Dave \ Desktop \ Weed Hunter.py", 줄 14, for tup.split (',')) in splitup_pits의 tup) 파일 "C : \ Users \ Dave \ Desktop \ Weed Hunter.py ", 줄 14, for tup.split (',')) in splitup_pits의 tup) 파일"C : \ Users \ Dave \ Desktop \ Weed Hunter.py ", 줄 14 , for tup.split (',')) split_pits의 tup에 대해 ValueError : int()가 10 ('230) 인 경우 문자가 유효하지 않습니다 (1' –

+0

) 그래서 텍스트의 내용 정수 픽셀 트립을 가진 파일 let은 일관되게 제안 된대로 작성된 것이 아닙니다 ;-) ... 물론이 새로운 정보는 큰 파일이라고 (메모리 또는 인쇄와 비교하여) 말하면 len()을 사용하여 추출 정보를 줄일 수 있습니다. 세트. 이것은 세트에 저장된 불연속 RGB 트리플렛으로 무엇을하고 싶은지에 달려 있습니다. – Dilettant

0

만 작은이 필요합니다.

om_set = set(eval(open('abc.txt').read())) 

결과

{(0, 19, 0), 
(0, 20, 0), 
(0, 21, 1), 
(0, 22, 0), 
(0, 24, 3), 
(0, 27, 0), 
(0, 29, 2), 
(0, 35, 2)} 

편집 여기 IPython 프롬프트에서 코드의 작업입니다.

@TimPietzcker으로
In [1]: file_ = open('abc.txt') 
In [2]: text_read = file_.read() 
In [3]: print eval(text_read) 
((0, 19, 0), (0, 20, 0), (0, 21, 1), (0, 22, 0), (0, 24, 3), (0, 27, 0), (0, 29, 2), (0, 35, 2), (0, 36, 1)) 
In [4]: type(eval(text_read)) 
Out[1]: tuple 
In [5]: print set(eval(text_read)) 
set([(0, 27, 0), (0, 36, 1), (0, 21, 1), (0, 22, 0), (0, 24, 3), (0, 19, 0), (0, 35, 2), (0, 29, 2), (0, 20, 0)]) 
+0

IOError가 발생했습니다 : [Errno 2] 해당 파일이나 디렉토리가 없습니다 :하지만 파일이 확실히 존재합니다 –

+0

Dw. 청취하기 시작했습니다. 이제 튜플 객체가 호출 가능하지 않다고 말합니까? –

+0

어떤 코드 줄을 가져 왔습니까? – cdarke

관련 문제