8

Django アーキテクチャにこの utils.py ファイルがあります。

def range_data(ip):
    r = []
    f = open(os.path.join(settings.PROJECT_ROOT, 'static', 'csv ', 
                          'GeoIPCountryWhois.csv'))
    for num,row in enumerate(csv.reader(f)):
        if row[0] <= ip <= row[1]:
            r.append([r[4]])
            return r
        else:
            continue
    return r

ここで ip パラメータは単なる IPv4 アドレスです。オープン ソースの MAXMINDGeoIPCountrywhois.csvファイルを使用しています。

のいくつかの開始コンテンツGeopIOCountrywhois.csv:

"1.0.0.0","1.0.0.255","16777216","16777471","AU","Australia"
"1.0.1.0","1.0.3.255","16777472","16778239","CN","China"
"1.0.4.0","1.0.7.255","16778240","16779263","AU","Australia"
"1.0.8.0","1.0.15.255","16779264","16781311","CN","China"
"1.0.16.0","1.0.31.255","16781312","16785407","JP","Japan"
"1.0.32.0","1.0.63.255","16785408","16793599","CN","China"
"1.0.64.0","1.0.127.255","16793600","16809983","JP","Japan"
"1.0.128.0","1.0.255.255","16809984","16842751","TH","Thailand"

この問題についても読みましたが、あまり理解できませんでした。そのエラーを解決するのを手伝ってくれませんか?

utils での私のメソッドによると、メソッドIPへのパラメーター アドレスの国名を確認しています。

4

3 に答える 3

14

今日、同様の問題がありました。行に最後の引用符がありませんでした。解決策はreader、引用符文字の特別な処理を実行しないように指示することです ( quoting=csv.QUOTE_NONE)。

于 2013-01-05T22:01:50.947 に答える
8
  1. 以下のように改行を削除することで、csvを前処理できます。

    import csv
    
    content = open("GeoIPCountryWhois.csv", "r").read().replace('\r\n','\n')
    
    with open("GeoIPCountryWhois2.csv", "w") as g:
        g.write(content)
    

    次に、csvリーダーにGeoIPCountryWhois2を使用します。

  2. ラインターミネーターを使用する野生の推測はあなたの問題を解決するかもしれません

    for num,row in enumerate(csv.reader(f,lineterminator='\n'))
    

    参照:http ://docs.python.org/lib/csv-fmt-params.html

于 2012-07-06T13:18:26.823 に答える
3

ファイルをバイナリとして開く必要があります。

def range_data(ip):
    r = []
    f = open(os.path.join(settings.PROJECT_ROOT, 'static', 'csv ', 
                          'GeoIPCountryWhois.csv'), 'rb')
    for num,row in enumerate(csv.reader(f)):
        # Your things.

'rb'そこのモードに注意してください。そうしないと、ファイルがネイティブの行末で開かれる可能性があり、CSV リーダーはさまざまな形式をうまく処理できません。確かに、私がダウンロードしたコピーにGeoIPCountryWhois.csvきれい\n行末があります。

これは.reader() メソッドについて文書化されています:

csvfile がファイル オブジェクトの場合、違いが生じるプラットフォームでは 'b' フラグを指定して開く必要があります。

ただし、csv ファイルが破損していて、予期しない場所に予期しない改行文字がまだ含まれている場合は、file代わりにこのサブクラスを応急処置として使用してください。

class CleanlinesFile(file):
    def next(self):
        line = super(CleanlinesFile, self).next()
        return line.replace('\r', '').replace('\n', '') + '\n'

このクラスは、最後の文字を除いて、返される結果のどこにも改行がないことを保証します (csv モジュールが必要とする方法と同じです)。open呼び出しの代わりに使用してください。この場合、'rb'モード修飾子はオプションになります。

def range_data(ip):
    r = []
    f = CleanlinesFile(os.path.join(settings.PROJECT_ROOT, 'static', 'csv ', 
                          'GeoIPCountryWhois.csv'))
    for num,row in enumerate(csv.reader(f)):
        # Your things.
于 2012-07-06T13:31:56.447 に答える