2017-08-30 3 views
1

Pythonに新しく、束を読んで多くの動画を見ました。私はそれを働かせることができず、私は不満を感じています。Python:URLの.csvをループして別の列として保存します

私は以下のようなリンクのリストを持っている:

"KGS ID","Latitude","Longitude","Location","Operator","Lease","API","Elevation","Elev_Ref","Depth_start","Depth_stop","URL" 
"1002880800","37.2354869","-100.4607509","T32S R29W, Sec. 27, SW SW NE","Stanolind Oil and Gas Co.","William L. Rickers 1","15-119-00164","2705"," KB","2790","7652","http://www.kgs.ku.edu/WellLogs/32S29W/1043696830.zip" 
"1002880821","37.1234622","-100.1158111","T34S R26W, Sec. 2, NW NW NE","SKELLY OIL CO","GRACE MCKINNEY 'A' 1","15-119-00181","2290"," KB","4000","5900","http://www.kgs.ku.edu/WellLogs/34S26W/1043696831.zip" 

私は、「URL」にアクセスして、ファイル名「API.las」と「場所」という名前のフォルダに保存するのpythonを取得しようとしています。

EX)...... "場所" /セクション/ "API" .las C://.../T32S R29W/Sec.27/15-119-00164.las

このファイルには、ダウンロードする行とリンクが100行あります。私はサーバに衝撃を与えないためにもスリープ機能を実装したかったのです。

これを行うさまざまな方法は何ですか?私はパンダや他のいくつかの方法を試しました...どんなアイデアですか?

+0

あなたがこれまでに試してみましたか?ジップでPD データ= pd.read_csv( 'MeadeLAS.csv') リンク= data.URL file_names = data.API リンクについて、file_nameのよう – Mortz

+0

'輸入パンダ(リンク、file_names): ファイル= pd.read_csv (リンク).to_csv(file_name + '。las'、index = False) ' – gdink1020

+0

@mortzはタグを忘れました – gdink1020

答えて

0

あなたはこの

for link, file_name in zip(links, file_names): 
    u = urllib.urlopen(link) 
    udata = u.read() 
    f = open(file_name+".las", w) 
    f.write(udata) 
    f.close() 
    u.close() 

のような何かをする必要があります、あなたは、解析のためにBeautifulSoupのようなスクレーピング図書館で見たいと思うかもしれません。

+0

私はそれをダウンロードし、それを列APIの値として保存したいリンクをたどる必要があります。私があなたの提案をどのように読んだのか、これは当てはまりません。 – gdink1020

+0

これはコードが正確にしようとしていることです。 'udata'は' link'の内容を保持し、あなたのAPIカラムから来る 'file_name'に書き込みます。それを試してみてください。全く異なるものを達成しようとしている場合は、それに応じて質問を編集してください。 – Mortz

+0

申し訳ありませんが、コードを読んでいると混乱しました。私はそれを動作させることができたそれを走った。書き出しのためにファイルを開くときは、編集だけがWを囲んで公開関数に引用符を入れていました。また、リンクは.zipをダウンロードするので、解凍する前に.lasに保存することが重要ですが、7zipを使用すると、ファイルを一括して解凍することができました – gdink1020

0

アプローチ1: -

あなたのファイルは1000行を想定しています。このmasterlist介し>
[ROW1、ROW2、ROW3など]

一度行わ、ループ -

この形式で格納されたデータを有するmasterlistを作成します。すべての繰り返しで文字列形式の行が得られます。 リストを分割し、URLの最後の列、つまり行[-1]

をスプライスし、result_urlという名前の空のリストに追加します。それはすべての行に対して実行されたら、それをファイルに保存し、アプローチ

向こう2簡単にあなたのファイルをosモジュールを使用してディレクトリを作成して移動することができます: -ファイルも巨大である場合

、読みあなたのデータをtryブロックで1行ずつ処理する(csvモジュールを使用して、各行をリストとして取得し、URLをスプライスし、毎回API.lasファイルに書き込むことができます)。

プログラムが1001行目を移動すると、「パスする」または通知を受け取るために印刷するブロックを除いて移動します。
アプローチ2では、すべてのデータをすべてのデータ構造に保存するわけではなく、実行時に1つの行を保存するだけなので、より高速です。

import csv, os 
    directory_creater = os.mkdir('Locations')  
    fme = open('./Locations/API.las','w+') 
    with open('data.csv','r') as csvfile: 
     spamreader = csv.reader(csvfile, delimiter = ',') 
     print spamreader.next() 
     while True: 
      try: 
       row= spamreader.next() 
       get_url = row[-1] 
       to_write = get_url+'\n' 
       fme.write(to_write) 
      except: 
       print "Program has run. Check output." 
       exit(1) 

このコードは、短時間で効果的に言及したすべてのことを行うことができます。ファイルの内容は、あなたが望んでいない場合

+0

ファイルに240,163行の一意のURLを保存する必要があります – gdink1020

+0

アプローチ2を使用してください(もう一度編集しました)。すべてのデータをリストに蓄積しないでください。 –

+0

@ gdink1020私のコードは動作していませんか? –

0

これは少し汚れているかもしれませんが、問題を解決するための最初の方法です。これは、すべて二重引用符で囲まれたCSVの各値に左右されます。これが真でない場合、この解決策は重い調整が必要です。

コード:

import os 

csv = """ 
"KGS ID","Latitude","Longitude","Location","Operator","Lease","API","Elevation","Elev_Ref","Depth_start","Depth_stop","URL" 
"1002880800","37.2354869","-100.4607509","T32S R29W, Sec. 27, SW SW NE","Stanolind Oil and Gas Co.","William L. Rickers 1","15-119-00164","2705"," KB","2790","7652","http://www.kgs.ku.edu/WellLogs/32S29W/1043696830.zip" 
"1002880821","37.1234622","-100.1158111","T34S R26W, Sec. 2, NW NW NE","SKELLY OIL CO","GRACE MCKINNEY 'A' 1","15-119-00181","2290"," KB","4000","5900","http://www.kgs.ku.edu/WellLogs/34S26W/1043696831.zip" 
""".strip() # trim excess space at top and bottom 

root_dir = '/tmp/so_test' 

lines = csv.split('\n') # break CSV on newlines 
header = lines[0].strip('"').split('","') # grab first line and consider it the header 

lines_d = [] # we're about to perform the core actions, and we're going to store it in this variable 
for l in lines[1:]: # we want all lines except the top line, which is a header 
    line_broken = l.strip('"').split('","') # strip off leading and trailing double-quote 
    line_assoc = zip(header, line_broken) # creates a tuple of tuples out of the line with the header at matching position as key 
    line_dict = dict(line_assoc) # turn this into a dict 
    lines_d.append(line_dict) 

    section_parts = [s.strip() for s in line_dict['Location'].split(',')] # break Section value to get pieces we need 

    file_out = os.path.join(root_dir, '%s%s%s%sAPI.las'%(section_parts[0], os.path.sep, section_parts[1], os.path.sep)) # format output filename the way I think is requested 

    # stuff to show what's actually put in the files 
    print file_out, ':' 
    print ' ', '"%s"'%('","'.join(header),) 
    print ' ', '"%s"'%('","'.join(line_dict[h] for h in header)) 

出力:

~/so_test $ python so_test.py 
/tmp/so_test/T32S R29W/Sec. 27/API.las : 
    "KGS ID","Latitude","Longitude","Location","Operator","Lease","API","Elevation","Elev_Ref","Depth_start","Depth_stop","URL" 
    "1002880800","37.2354869","-100.4607509","T32S R29W, Sec. 27, SW SW NE","Stanolind Oil and Gas Co.","William L. Rickers 1","15-119-00164","2705"," KB","2790","7652","http://www.kgs.ku.edu/WellLogs/32S29W/1043696830.zip" 
/tmp/so_test/T34S R26W/Sec. 2/API.las : 
    "KGS ID","Latitude","Longitude","Location","Operator","Lease","API","Elevation","Elev_Ref","Depth_start","Depth_stop","URL" 
    "1002880821","37.1234622","-100.1158111","T34S R26W, Sec. 2, NW NW NE","SKELLY OIL CO","GRACE MCKINNEY 'A' 1","15-119-00181","2290"," KB","4000","5900","http://www.kgs.ku.edu/WellLogs/34S26W/1043696831.zip" 
~/so_test $ 
+0

ここには出力のサンプル[リンク](http://www.kgs.ku.edu/oracle/las40033.txt)のリンク – gdink1020

+0

ディレクトリパスを作成するコードの正しいですが、実際にフォルダパスを作成するコードを取得できません。また、URLに従ってダウンロードを開始し、上記のAPI.like @Mortzとしてファイルを保存するコードが必要です。あなたが提供したディレクトリがあれば、/ tmp/so_test/T32S R29W/Secのようになります。 27/15-119-00164.las。 – gdink1020

関連する問題