2013-12-22 4 views
1

기본적으로 텍스트 파일에서 문자열을 읽고 목록에 3 개씩 넣은 다음 3 개씩 3 개 목록을 다른 목록에 넣고 싶습니다. 사실 (그러나 내가 원하는 단지 예를 들어, 나는 그것을 구조화 수) 나를 더 나은 :)Python - 문자열을 목록으로 다른 목록으로 가져 오기 :)

텍스트 파일 설명하자

party  
sleep 
study  
-------- 
party 
sleep 
sleep  
----- 
study 
sleep 
party 
--------- 

이 등이에서

, 내가 파이썬 목록을 만들려면 그 모양은 다음과 같습니다.

List1 = [['party','sleep','study'],['party','sleep','sleep'],['study','sleep','party']etc] 

하지만 매우 어렵습니다. 나는 다음과 같은 것을 실험하고 있었다 :

test2 = open('test2.txt','r') 
List=[] 

for line in 'test2.txt': 
    a = test2.readline() 
    a = a.replace("\n","") 
    List.append(a) 
    print(List) 

그러나 이것은 단지 끔찍한 끔찍한 일이다. 이것을 달성하는 방법?

+1

이것은 당신이 :) 다시 설정 또는 사용 계수 중 임시 카운터의 전형적인 경우이다. –

+2

텍스트 파일에는 실제로 텍스트 파일에 대시가 포함 된 행이 들어 있습니다. '--------'목록 사이의 구분 기호로 사용 하시겠습니까? – ChrisProsser

+0

글쎄, 내가 직접 넣어 놨어. 그렇지 않으면 한 시퀀스를 끝내고 어디서 시퀀스를 끝내고 새 시퀀스를 시작해야 할지를 아는 것이 어려울거야. : o 그러나 좋은 방법으로 텍스트 파일을 구조화하는 방법에 대한 제안은 모두 열려 있습니다! – imfromsweden

답변

3

당신이 함께 시도 할 수 있습니다 :

res = [] 
tmp = [] 

for i, line in enumerate(open('file.txt'), 1): 
    tmp.append(line.strip()) 
    if i % 3 == 0: 
     res.append(tmp) 
     tmp = [] 

print(res) 

party,sleep,study 
party,sleep,sleep 
... 

이제 각 라인은 하위 목록입니다

대시가 없다고 가정했습니다. es.

편집 :

여기

하면 대시가있는 경우에 대한 예입니다

res = [] 
tmp = [] 

for i, line in enumerate(open('file.txt')): 
    if i % 4 == 0: 
     res.append(tmp) 
     tmp = [] 
     continue 
    tmp.append(line.strip()) 

print(res) 
+0

다음과 같이 간단합니다.) –

+0

멋진 깨끗한 해결책 – ChrisProsser

+0

오, 고마워요! 나는 단지 그것의 반을 이해하지만, 오 잘 : D 나는 당신이 "-----"에서 텍스트 파일을 제거했다고 봅니다. 그렇다면 한 시퀀스가 ​​시작되고 다음 시퀀스가 ​​끝나는 위치를 추적하는 것이 매우 어려울 것입니다. 텍스트 파일에서이 세 시퀀스를 쉽게 편집 할 수 있기를 원한다고 가정하면 시작 부분과 끝 부분을 알지 못하는 것이 매우 귀찮을 수 있습니다.이 중 어떤 것이 든 사용할 수있는 방법이 있습니까? 시퀀스? 감사합니다. btw! – imfromsweden

4

데이터를 3 크기로 그룹화하려는 경우 텍스트 파일의 데이터가 구분 기호로 그룹화되지 않았다고 가정합니다.

파일을 순차적으로 읽고 목록을 만들어야합니다. 그룹에 당신은 파일 객체와 컨텍스트 관리자를 만들기 실행의 알려진 grouper algorithms

from itertools import izip, imap 
with open("test.txt") as fin: 
    data = list(imap(list, izip(*[imap(str.strip, fin)]*3))) 

pprint.pprint(data) 
[['party', 'sleep', 'study'], 
['party', 'sleep', 'sleep'], 
['study', 'sleep', 'party']] 

단계

  1. 중 하나를 사용할 수 있습니다 IT.
  2. 각 줄을 벗겨냅니다. 사이즈 3의 반복자 목록 지퍼를 사용
  3. (개행 제거) 상기 항목
  4. 가리스트로 생성 식 변환 나열 튜플 변환 세 항목의 튜플로 그룹화되는 것을 보장한다.

모두가 생성기 표현식이라고 생각하면, 이는 단일 반복에서 수행됩니다. 데이터가 분리 구분에 의해 그룹화되는 경우

대신 ------ 당신이 itertools.groupby 솔루션 실행

  1. from itertools import imap, groupby 
    class Key(object): 
        def __init__(self, sep): 
         self.sep = sep 
         self.count = 0 
        def __call__(self, line): 
         if line == self.sep: self.count += 1 
         return self.count 
    
    
    with open("test.txt") as fin: 
        data = [[e for e in v if "----------" not in e] 
         for k, v in groupby(imap(str.strip, fin), key = Key("----------"))] 
    
    
    pprint.pprint(data) 
    [['party', 'sleep', 'study'], 
    ['party', 'sleep', 'sleep'], 
    ['study', 'sleep', 'party']] 
    

    단계 키 클래스 만들기를 사용할 수 증가 분리기가있을 때 카운터. 함수 호출은 조건부로 증가시킬 때마다 호출 된 매번 카운터를 울립니다.

  2. 파일 개체를 사용하여 컨텍스트 관리자를 만듭니다.
  3. 각 줄을 벗겨냅니다.
  4. itertools.groupby을 사용하고 사용자 지정 키를 사용하여 그룹화
  5. 그룹화 된 데이터에서 구분 기호를 제거하고 그룹 목록을 만듭니다.
0

첫 번째 큰 문제 :

for line in 'test2.txt': 

당신은 당신이 열 파일을 통해 루프 필요

't', 'e', 's', 't', '2', '.', 't', 'x', 't' 

당신에게 제공합니다

for line in test2: 

또는 더 나은 :

다음, 당신은해야 할 두 가지 중 하나를

  1. 라인이, 그렇지 않으면 새 하위 목록 (myList.append([]))
  2. 을 만들 마지막 하위 목록에 라인을 추가 "-----"가 포함 된 경우 귀하의 목록에 (myList[-1].append(line))

마지막으로, print 마지막까지 들여 쓰기가되어서는 안됩니다. 현재 처리가 완료되었을 때가 아니라 모든 행에 대해 인쇄됩니다.

List.append(a) 
print(List) 

아마도 파일에 대한 더 나은 구조는 다음과 같습니다

for line in f: 
    myList.append(line.split(',')) 
+0

좋은 답변, 많이 고마워! 나는 실제로 심지어이 게시물의 대부분을 이해하고 있습니다. : D 파티, 수면, 공부로 구조를 유지하기위한 귀하의 제안 수면, 공부, 수면 정말 좋은 환호였습니다. 유일한 문제는 내가 행을 바꿀 때부터 목록에서 "\ n"을 얻는다는 것입니다. (당신이 쉽게 3 개의 시작과 끝나는 곳을 쉽게 말할 수 있어야한다고 생각합니다.) 그리고 나는 생각합니다. 그것은 몇 가지 문제를 일으킬 수 있습니다.나는 replace ("\ n", "") 함수를 사용하려했지만 파이썬은 그 중 하나를 가지고 있지 않았다. 이유는 확실하지 않습니다. tbh, 그것의 마침표는 다음과 같습니다 :) – imfromsweden

+0

'line = line.strip()을 사용하여 행의 시작과 끝에서 공백과' '\ n' '문자를 제거 할 수 있습니다. – jonrsharpe

관련 문제