2017-08-17 12 views
1

私は関連する国を取得するために、ファイルからより多くの1000の座標を読みます。私は時間制限を殺そうとしましたが、それはまだ機能しません、それは150-160座標後に停止します。これはできますか?Python、geopy kill time limit

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
import os, sys 


with open('alagridsor.txt') as f: 
    lines = f.read().splitlines()  


for sor in range(1, 9271): 
    print(sor) 

    koor = lines[sor] 

    from geopy.geocoders import Nominatim 
    from geopy.exc import GeocoderTimedOut 

    geolocator = Nominatim() 
    location = geolocator.reverse(koor, timeout=None) 
    cim = location.raw['address']['country'] 

    print(cim) 

    f = open('out.txt', 'a') 
    f.write(cim.encode('utf8')) 
    f.write("\n") 

答えて

2

問題

  1. f.read()を使用し、サイズが読み取られ、返されるファイルの内容全体をもたらす省きます。ファイルがマシンのメモリの2倍の大きさであれば、問題が発生します。
  2. 出力ファイルを常にforループ内で開くのは非常に高価です。

解決策

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
import time 
from geopy.geocoders import Nominatim 

geolocator = Nominatim(timeout=None) 
fobj_out = open('out.txt', 'a') 
with open('alagridsor.txt') as fobj_in: 
    for koor in fobj_in: 
     location = geolocator.reverse(koor.rstrip()) 
     cim = location.raw['address']['country'] 
     fobj_out.write(cim.encode('utf8')) 
     fobj_out.write("\n") 
     time.sleep(0.5)  # delay 5 milli-seconds between each request 
fobj_out.close() 
+0

ありがとうございました!私はすぐにそれを試してみます... –

+0

koor.rstrip()の行に "インデントブロックが必要"と書いてあります。 –

+0

何もありません... :) –