2016-08-24 9 views
0

テキサス州の実行された犯行者からHTMLテーブルを取得するスクリプトを作成しました(制限のためにリンクを投稿できませんが、getcsv.pyのコードで見つけることができます)それをcsvファイルに保存します。別のスクリプトは、各人のレースをカウントアップします。しかし、私はホワイトとヒスパニックの両方の1つを除くすべてを数えるという問題を抱えていました。そしてそれを別々に数えます。これは、[('White', 237), ('Black', 196), ('Hispanic', 100), ('Other', 2), ('White ', 1), ('Hispanic ', 1)]です。 Pythonはcsvファイルのユニークとして重複をカウントします

この

は、CSVファイルをダウンロードするスクリプト(getcsv.py)

import csv 
from bs4 import BeautifulSoup 
from urllib.request import urlopen 

soup = BeautifulSoup(urlopen('http://www.tdcj.state.tx.us/death_row/dr_executed_offenders.html'), "html.parser") 
table = soup.find('table') 
headers = [header.text for header in table.find_all('th')] 
rows = [] 
for row in table.find_all('tr'): 
    rows.append([val.text for val in row.find_all('td')]) 

with open('new.csv', 'w', encoding="utf8", newline='') as f: 
writer = csv.writer(f) 
writer.writerow(headers) 
writer.writerows(row for row in rows if row) 

これはインクルードは、レースを取るスクリプト(analyse.py)しかし

import csv 
import collections 


race = collections.Counter() 



with open('new.csv') as input_file: 
    next(input_file) 
    for row in csv.reader(input_file, delimiter=','): 
     race[row[8]] += 1 

list(race) 
racecom = race.most_common() 


print ('Number of white people executed: %s' % grades['White']) 
print ('Number of black people executed: %s' % grades['Black']) 
print ('Number of Hispanic people executed: %s' % grades['Hispanic']) 
print ('Number of Other people executed: %s' % grades['Other']) 
print (racecom) 

私が使用しているありますconvertcsv.orgによって生成されたcsvファイルは消えてしまいます。そのため、getcsv.pyには障害があります。

生成されたファイルはhttps://www.dropbox.com/s/gz0kob2miejqucq/actual.csv?dl=0として実際の.csvでダウンロードでき、自動ダウンロードされたファイルはhttps://www.dropbox.com/s/chkycm21konvcw0/new.csv?dl=0としてnew.csvにあります。

ありがとうございます。

+3

「ヒスパニック」と「ヒスパニック」の2つのキーが異なる場合は、キーを削除する必要があります。 'Counter 'に追加するときに空白を' .strip() 'してください。 –

+0

@ M.Klugerfordありがとう!私は以下の答えを(私自身の愚かさのせいで)分かりませんでした。あなたのコメントはそれを説明しました。 – GeekPro101

答えて

2

空白が重要です。

with open('new.csv') as input_file: 
    next(input_file) 
    race = collections.Counter(row[8].strip() 
     for row in csv.reader(input_file, delimiter=',')) 
+0

あなたの答えをありがとう、私はそれを受け入れ、今それは動作します。 – GeekPro101

関連する問題