2017-04-23 3 views
1

읽어 주셔서 감사합니다! 나는 이것에 아주 익숙하지만 어제 나는 웹 사이트에서 데이터 (항목의 이름과 해당 가격)를 추출하기 시작했으며 파이썬 2.7을 사용하여 주어진 웹 사이트의 price, item-name 형식으로 CSV 파일을 만드는 방법을 알아 냈다. 이제 데이터를 비교하고 주어진 아이템 이름에 대해 평균 가격을 얻으려고합니다. 내가 지금 직면하고있는 문제는 각 웹 사이트마다 항목 이름이 다를 수 있다는 것입니다. 예를 들어 첫 세트는CSV 텍스트를 정리하고 파이썬으로 비교하기

4.0, Jungle Book 
5.0, "Peter Pan" 
4.0, Lady and the Tramp 

두 번째 CSV 파일 세 번째는 내가

같은 평균 출력 파일을하려는 결국

5.0, Up (DVD) 
4.0, Peter pan (DVD) 
6.0, "Lady and the Tramp" (DVD) 

을 제공

5.0, Disney's Jungle Book 
6.0, Disney's Up 
4.0, Disney's Peter Pan 

제공을 제공합니다

4.5, Jungle Book 
5.0, Lady and the Tramp 
4.33, Peter Pan 
5.5, Up 

내 첫 번째 문제는 내 csv 파일에있는 "또는 특정 단어 (예 :"Disney 's ","(DVD) ")와 같은 특수 문자를 삭제하는 것입니다. CSV 파일에서 행과 열을 삭제하는 방법에 대한 정보는 찾았지만이 요소 내부에서 편집하는 데 어려움이 있습니다. 이런 식으로 뭔가 그 해결 것입니다 일단, 나는 평균 가격을 먹고 싶어 ..

import csv 
import string 

input_file = open('DesktopData.csv', 'r') 
output_file = open('fixformat.csv', 'w') 
data = csv.reader(input_file) 
writer = csv.writer(output_file,quoting=csv.QUOTE_ALL)# dialect='excel') 
specials = '(DVD)' 

for line in data: 
    line = str(line) 
    new_line = str.replace(line,specials,'') 
    writer.writerow(new_line.split(',')) 

input_file.close() 
output_file.close() 

작품의 종류 '(DVD)를'제거하지만 내 CSV 더 "를 선택하고 [문자로 더 큰 혼란을 제기하게하는 주어진 제목. 나는 이것이 내가이 얻을 것이 일단

Jungle Book, 4.0, 5.0 
Lady and the Tramp, 4.0, 6.0 
Peter Pan, 5.0, 4.0, 4.0 
Up, 6.0, 5.0 

내가 확신 OUPUT하는 마음에 무언가를 가지고 있지만 정말 내 머리에

Read all titles and put in mainlist; 
if title already exsists, ignore/dont make new row with title 
Read all files and compare with mainlist; 
if title is found, put corresponding price in new column behind title 

그것을 알아 내기 위해 파이썬 구문 부족 나는 그것을 안으로 만들 수있다. 평균 CSV 파일로. 어떤 조언을 매우 높이 평가됩니다!

+0

팬더를 가져 와서 놀고 싶을 것입니다. pd.read_csv() 메소드를 살펴 보자. – Aklys

답변

0

이 중 가장 힘든 부분은 어떤 이름이 같은지, 작은 차이는 무엇인지를 찾는 것입니다. 여기 솔루션에서는 간단한 normalize_title 함수를 만들었지 만 완벽하지는 않습니다. 수동으로 조정하고 각 새 데이터 세트를 확장해야합니다.

import csv 

filenames = ['first.csv', 'second.csv', 'third.csv'] 
outfile = 'avg.csv' 

removables = ['[', ']', '"', "'", "Disney's", '(DVD)'] 
def nomalize_title(title): 
    for remove in removables: 
     title = title.replace(remove, '') 
    title = title.lower() # Correct capitalization is HARD 
    return title 

moviecosts = dict() 
for filename in filenames: 
    with open(filename, 'rb') as f: 
     reader = csv.reader(f) 
     for row in reader: 
      raw_title = row[1] 
      title = normalize_title(raw_title) 
      price = float(row[0]) 

      if not moviecosts.has_key(title): 
       moviecosts[title] = [] 

      moviecosts[title].append(price) 

with open(outfile, 'wb') as f: 
    writer = csv.writer(f) 
    for movie in moviecosts: 
     avg_cost = sum(moviecosts[movie])/len(moviecosts[movie]) 
     row = [avg_cost, movie] 
     writer.writerow(row) 

로 볼 수 있습니다 :하지만, 그것과 아파트, 여기에 새로운 CSV 파일의 영화 제목과 함께 평균 비용을 여러 CSV 파일에서 데이터를 수집하고 저장하여 문제에 대한 해결책이다 , 다른 비용을 목록 사전에 저장하고 있습니다. 나에게 이것은 당면한 문제에 대한 가장 자연스러운 데이터 구조 인 것처럼 보인다.

+0

시간 내 주셔서 감사합니다. 방금 실행했습니다. 현재 데이터베이스에있는 모든 DVD의 전체 평균 인 1 개의 셀에 1 개의 값을 출력하지만, 이것은 분명 도움이됩니다. 정규화 후 제목이있는 목록을 찾을 수 없습니다. '영화'에서 어디에서 제목을 찾을 수 있습니까? – Alex

+0

평균 한 개만 얻으면 모든 제목이 동일한 문자열에 대해 '정규화'되었음을 의미합니다. 'moviecosts' dict를 인쇄 할 때 무엇을 가지고 있습니까 – JohanL

+0

moviecosts를 인쇄하면 {None : [4.0, 12.0, ...., 22.0]}이 표시되므로 저장된 제목은 없습니까? 변수 탐색기에서 나는 raw_title이 마지막 데이터베이스의 마지막 제목까지 올라가는 것을 볼 수 있습니다. 그리고 모든 데이터베이스 가격은 moviecosts입니다. – Alex

관련 문제