2016-11-04 2 views
0

저는 파이썬 시작과 함께 CSV 파일의 데이터를 정리하려고합니다. 나는 각 이메일에 대한 행을 복제하는 방법을 이해하지 않습니다Python CSV 문자열 슬라이싱 문제

companyNameA | [email protected];[email protected];[email protected] | date joined 

:

나는 그러나 일부 필드는이 같은 여러 개의 이메일을, 이메일의 목록을 가지고있다. 다른 데이터는 동일하게 유지해야하지만 이메일은 달라야이 같은 :

companyNameA | [email protected] | date joined 
companyNameA | [email protected] | date joined 
companyNameA | [email protected] | date joined 

내가 이것을 시도했지만 작동하지 않습니다 single_email = email.rsplit(';', 1)[0]

f = open('data_file.csv') 
csv_f = csv.reader(f) 

for row in csv_f: 
    email = row[1] 
    single_email = email.rsplit(';', 1)[0] 
+0

인쇄 하시겠습니까? 아니면 다시 구조화하고 다시 파일에 쓰려고하십니까? – idjaw

+0

글쎄 그건 좋은 출발이지만, 당신은 실제로 당신의 CSV 파일을 수정하려고 시도 했습니까? – Julien

답변

0

당신은 하나의 메일을 받고있어 주소. 당신은 두 번째 열을 분할하고, 루프에서 그들을 통해 이동,이 같은 수 있습니다 : 당신은 하나 개의 CSV 라인에서 읽을 필요가

f = open('data_file.csv') 
csv_f = csv.reader(f) 

for row in csv_f: 
    email = row[1] 
    for mail_addr in email.split(';'): 
     do_something() 
1

을 선으로 더 이상의 경우 여러 줄에 다른 쓰기. 이메일 열에 이메일이 있습니다.

fin = open('data_file.csv') 
fout = open('out_data_file.csv', 'w') 

csv_fin = csv.reader(fin) 
csv_fout = csv.writer(fout) 

for row in csv_fin: 
    emails = row[1].split(';') 
    if len(emails) > 1: 
     for e in emails: 
      csv_fout.writerow((row[0], e, row[2])) 
    else: 
     csv_fout.writerow(row) 

희망하시는 바입니다.

1

각 이메일 주소에 대한 행을 만들려면 먼저 입력 된 CSV 파일에서 각 행을 읽어야합니다. 이 작업은 구분 기호가 | 문자로 설정된 CSV 판독기 개체를 사용하여 수행됩니다. 그런 다음 writerows() 함수를 사용하여 ; 문자의 두 번째 열 항목을 분할하여 찾은 각 전자 메일 주소에 대해 하나씩 여러 행을 쓸 수 있습니다.

이 예제에서는 생성기를 사용하여 수행합니다. 각 전자 메일 주소에 대해 입력 행의 첫 번째 열, 현재 전자 메일 주소 및 항목 행의 마지막 열을 포함하는 행이 만들어집니다. writerows() 기능은 모든 전자 메일을 읽을 때까지 계속 작동합니다 (1 일 수도 있음).

마지막으로 여분의 공백을 출력에 유지하려면 현재 가능한 공백을 제거하기 위해 현재 전자 메일 주소에 strip()이 사용되고 전자 메일 주소 앞뒤에 공백이 추가되도록 format()이 사용됩니다.

import csv  

with open('input.csv', 'rb') as f_input, open('output.csv', 'wb') as f_output: 
    csv_input = csv.reader(f_input, delimiter='|') 
    csv_output = csv.writer(f_output, delimiter='|') 

    for row in csv_input: 
     csv_output.writerows([row[0], ' {} '.format(email.strip()), row[2]] for email in row[1].split(';')) 

참고로 파이썬의 CSV 모듈에서는 구분 기호를 여러 문자로 사용할 수 없습니다.