-3

(国名のスペル) 2 つの csv ファイルの値を比較し、一致しなかった国の名前を出力しようとしています。国名を持つ 2 つのデータセットに対して空間分析を行っていますが、国名のスペルミスが原因であると思われる不正確な結果を受け取りました。国名を抽出し、比較のために 2 つの異なる CSV ファイルに保存しました。私はこのサイトで他のいくつかの例を見てきました (多くはいくつかの列を比較し、他のさまざまな機能を実行しようとしています)、コードの操作に成功していません。

4

2 に答える 2

3

これを簡単に確認します。

import requests
import bs4     # the 'beautifulsoup4' module
import pickle

# find an 'all the countries' listing
url = "http://www.nationsonline.org/oneworld/countries_of_the_world.htm"
r   = requests.get(url)
bs  = bs4.BeautifulSoup(r.text)

# grab all table rows
rows = [
    [cell.text.strip() for cell in row.findAll('td')]
    for row in bs.findAll('tr')
]
# filter for just the rows containing country-name data
rows = [row[1:] for row in rows if len(row) == 4]

# create a look-up table
country = {}
for en,fr,lo in rows:
    country[en] = en
    country[fr] = en
    country[lo] = en

# and store it for later use
with open('country.dat', 'wb') as outf:
    pickle.dump(country, outf)

これで、さまざまな国のスペルを取得し、それぞれの正規の英語名を返すdictができました。データによっては、これを拡張してISO国の略語などを含めることもできます。

dictにないスペルについては、近い代替を検索できます。

import difflib

def possible_countries(c):
    res = difflib.get_close_matches(c, country.keys(), cutoff=0.5)
    return sorted(set(country[r] for r in res))

これを使用して.csvファイルを処理し、適切な置換を求めることができます。

import sys
import pickle
import csv

def main(csvfname):
    # get existing country data
    with open('country.dat', 'rb') as inf:
        country = pickle.load(inf)

    # get unique country names from your csv file
    with open(csvfname, 'rb') as inf:
        data = sorted(set(row[0] for row in csv.reader(inf)))

    for c in data:
        if c not in country:
            print('"{}" not found'.format(c))
            sugg = possible_countries(c)
            if sugg:
                print('Suggested replacements:\n  {}'.format('\n  '.join(sugg)))
            else:
                print('(no suggestions)')
            repl = raw_input('Enter replacement value (or <Enter> for none): ').strip()
            if repl:
                country[c] = repl

    # re-save country data
    with open('country.dat', 'wb') as outf:
        pickle.dump(country, outf)

if __name__=="__main__":
    if len(sys.argv) == 2:
        main(sys.argv[1])
    else:
        print('Usage: python fix_countries.py csvfname')
于 2012-08-11T19:11:53.540 に答える
1

私があなたを正しく理解しているなら、あなたは使うことができます

diff -u file1 file2

または他のファイル比較ツール。そうでない場合は、入力ファイルの詳細を指定してください。

于 2012-08-11T14:52:04.580 に答える