2016-10-12 4 views
3

특정 열에 대해 특정 패턴으로 루프를 돌리고 같은 이름의 새 파일에 출력 패턴을 저장해야하는 CSV 파일 + "_pattern"+ [1,2,3 , 등.] + .csv.열을 통한 파이썬 검색

이것은 검색 패턴입니다. 열 1을 반복하고 동일한 #을 찾아서 붙잡은 다음 잡은 목록의 열 2를 반복 한 다음 2 열에서 같은 날짜를 가진 모든 것을 가져온 다음 4 열로 이동하십시오 그리고 같지 않은 모든 #들을 집어 넣은 다음 열 1의 패턴과 열 시간순으로 구성된 2와 4의 패턴으로 파일을 만듭니다.

예 :

1. 13.45 9/29/2016 6:00 98765 
2. 13.45 9/29/2016 6:07 98764 
3. 13.45 9/29/2016 6:21 98766 

을하지만 포함되지 것입니다 :

1  2   time 4 
13.45 9/29/2016 6:00 98765 
12.56 9/29/2016 6:05 76548 
13.45 9/29/2016 6:07 98764 
13.45 9/29/2016 6:21 98766 
13.45 9/29/2016 6:20 96765 
12.56 9/29/2016 6:06 76553 

Better view of table

결과는 것, file_pattern_1.csv는 것

4. 13.45 9/29/2016 6:20 96765 

때문에 이전 항목에서 4 반복 열은 file_pattern_2.csv는 것 :

1. 12.56 9/29/2016 6:05 76548 
2. 12.56 9/29/2016 6:06 76553 

이것은 내가 지금까지 무엇을하지만 난이 반복 논리에 분실되었다 : 이상 당신 루프로

import os 

infile = raw_input("Which file are we working with? ") 
assert os.path.exists(infile), "Path is incorrect." 
os.chdir(infile) 

def createFile(csvFile, fileName): 
    with open (fileName, 'wb') as ftext: 
     ftext.write(csvFile) 

def appendFile(csvFile, fileName): 
    with open (fileName, 'a') as ftext: 
     ftext.write(csvFile) 

def setfilename(tread): 
    fileName = tread[0:tread.index('.')] + '_patterns' + str(countItem) + '.csv' 
    return fileName 

for i in pcolumn: 
    if pcolumn == pcolumn: 
     return pfile 
    for x in date: 
     if date == date: 
      return date 
      for a in acolumn: 
       if acolumn != acolumn: 
        createFile(fileName) 
else: 
    print "Finished." 
+2

팬더 패키지를 사용하십시오. 'df.groupby ('col1')'을 반복 실행하여 파일을 덤프합니다. – jf328

+0

예에서, 모든 열 4 항목은 고유합니까? –

+0

@ MartinEvans 맞습니다. 열 4 항목은 모두 unquie입니다. – Aggs

답변

1

다음은 필요한 것을 수행해야합니다. csv 파일을 읽어 들여 정확하게 정렬 할 수 있도록 각 항목에 대해 일치하는 datetime을 생성합니다. 날짜별로 정렬 된 항목이있는 패턴 번호를 기반으로 출력 csv 파일을 만듭니다. 이미 볼 수있는 열 4 항목은 다음과 같습니다.

from itertools import groupby 
from datetime import datetime 
import csv 
import os 

filename = 'my_data.csv' 
data = [] 

with open(filename, 'rb') as f_input: 
    csv_input = csv.reader(f_input, delimiter='\t') 
    header = next(csv_input) 

    for row in csv_input: 
     dt = datetime.strptime('{} {}'.format(row[2], row[1]), '%H:%M %m/%d/%Y') 
     data.append([dt] + row) 

for index, (k, g) in enumerate(groupby(sorted(data, key=lambda x: x[1]), key=lambda x: x[1]), start=1): 
    line = 1 
    seen = set() 

    with open('{}_pattern_{}.csv'.format(os.path.splitext(filename)[0], index), 'wb') as f_output: 
     csv_output = csv.writer(f_output) 

     for item in sorted(g, key=lambda x: x[0]): 
      if item[4] not in seen: 
       seen.add(item[4]) 
       csv_output.writerow([line] + item[1:]) 
       line += 1 
+0

흥미로운 접근 방식! 고맙습니다! – Aggs

+1

'lambda'는 한줄짜리 함수의 약식입니다. 필요한 경우 이름이있는 일반 함수로 바꿀 수 있습니다. 그래서 제 경우에는 단일 인수'x'를 얻고'x [1]'을 리턴합니다. –

1

당신의 어떤 패턴이 저장에 적합하지 않은지 기록을 유지해야하는 파일. 이 목적으로 set을 사용할 수 있습니다. 각 파일에 항목을 그룹화하려면 itertools.groupby을 사용할 수 있습니다. 귀하의 예를 사용하여 다음 디렉토리에서 파일 경로를 수집하기위한 glob 모듈에서의 모습, 추가 제안으로

import itertools 

f = [i.split(" ") for i in """1  2   time 4 
13.45 9/29/2016 6:00 98765 
12.56 9/29/2016 6:05 76548 
13.45 9/29/2016 6:07 98764 
13.45 9/29/2016 6:21 98766 
13.45 9/29/2016 6:20 96765 
12.56 9/29/2016 6:06 76553""".split("\n")[1:]] 


seen_patterns = set([('9/29/2016', '96765')]) # You need to add entries to this set which you want to exclude 

# Sort and group your entries by the first and second columns 
col1 = itertools.groupby(sorted(f, key=lambda x: (x[0], x[1])), key=lambda x: (x[0], x[1])) 
for k, v in col1: 
    v = list(v) 
    # Filter out patterns which are not allowed 
    to_save = [" ".join(i) for i in v if (i[1], i[3]) not in seen_patterns] 
    for i in to_save: 
     print i # Save this to an appropriate file 
    print 

>>> 
12.56 9/29/2016 6:05 76548 
12.56 9/29/2016 6:06 76553 

13.45 9/29/2016 6:00 98765 
13.45 9/29/2016 6:07 98764 
13.45 9/29/2016 6:21 98766 

을 한 정말 유용합니다.

+0

대단히 감사합니다! 질문 : 코드에서 람바는 정확히 무엇을합니까? 나는 그것을 보았고 전에 그것을 사용했지만 결코 lamba가 작동 한 이유를 이해할 수 없었다. – Aggs

+1

처음에는 조금 혼란 스러울 수 있지만 람다는 단순한 함수의 구문 일뿐입니다. 아이디어를 얻는 데 도움이되는 몇 가지 예제 검색을 권합니다. – kezzos