2016-12-31 17 views
1

「CSV」ファイルに列を追加しようとしていますが、前のCSVファイルからコピーできますが、次の2列を書き込むときには、最後の行は、残りの行については、speedwind_dirsです。 2つの数字は手前のforループで作成されています。これをリストに保存してから書き込んでください。どんなアイデアも素晴らしいだろう。おかげPythonのCSVファイルに2つの新しい列を書き込む

with open('latlon.csv', 'r') as csvfile: 
    with open('wind2.csv', 'w') as csvoutput: 
     towns_csv = csv.reader(csvfile, dialect='excel') # csv reader 
     writer = csv.writer(csvoutput, lineterminator='\n') # csv writer 
     for rows in towns_csv: 
      x = float(rows[2]) #gets x axis 
      y = float(rows[1]) # gets y axis 
      url = ("http://api.met.no/weatherapi/locationforecast/1.9/?") #start of url string 
      lat = "lat="+format(y) #creates the latititue part of the url string 
      lon = "lon="+format(x) # creates the longitude part of the url string 
      text = url + format(lat) + ";" + format(lon) #combines the strings together to create a new url 
      response = requests.get(text) # get the url 
      xml_text=response.text # turns the requested url into a text file 
      winds= bs4.BeautifulSoup(xml_text, "xml") #uses BeautifulSoup to make an xml file 
      wind_all = winds.find_all("windSpeed") # finds the "windSpeed" element 
      speed = wind_all[0].get("mps") # finds the first "mps" attribute 
      wind_dir = winds.find_all("windDirection")# finds the "windDirection" element 
      wind_dirs = wind_dir[0].get("deg") #finds the "deg" attribute 
      new = [] 
      row = next(towns_csv) 
      row.append(speed) 
      row.append(wind_dirs) 
      new.append(row) 
      for item in towns_csv: 
       item.append(speed) 
       item.append(wind_dirs) 
       new.append(item) 
       writer.writerow(item) 
+0

これは私にとって正しくはありません: 'writer.writerow(rows + [speed] + [wind_dirs])'。 'row'(単数形)を書くつもりでしたか?私はあなたが 'zip 'の後にそのコード行で作成している構造を描写するのに苦労しています。残念ながら、それがどのように演奏されているか見るためには自分自身を実行できません。 – roganjosh

+0

あなたの編集でコードが壊れている可能性があります。あなたは 'for rows'をネストしました。編集:そして今あなたはそれを元に戻しました。私はあなたが編集を続けていることを示唆するためにこれらのコメントを作成していません - あなたの投稿されたコードはあなたが使っているものの正確な表現ですか?それは重要な部分です。あなたがそれを一変させ続ければ、誰もあなたのデバッグを手助けすることはできません。 – roganjosh

+0

'writer.writerow'の使用は正しいです。そのリストの各要素が出力の列であるリストが必要です。 'zip'を使い、その呼び出しの中でリストを連結するのは不思議で、あなたが不正なリストを取得していると思いますが、私はテストできません。基本的には、前のcsv(リストになる)から行を取り出し、そのリストの余分な列を単に「延長」してそれを書き戻すことを考えているだけでしょう。 – roganjosh

答えて

0

をフォーマットし、コードの最終行の改造列のわずかな修正を含む次の調整を考えます。 または新しいリストと最後のforループの必要はありません。単純に、wind2.csvlatlong.csvファイルの行があるへのAPIデータを追加し、新しいファイルに書き込む:

import csv 
import requests 
import bs4 

with open('latlon.csv', 'r') as csvfile, open('wind2.csv', 'w') as csvoutput: 
    towns_csv = csv.reader(csvfile, dialect='excel') # csv reader 
    writer = csv.writer(csvoutput, lineterminator='\n') # csv writer 
    for rows in towns_csv: 
     x = float(rows[2])        # gets x axis 
     y = float(rows[1])        # gets y axis 
     url = "http://api.met.no/weatherapi/locationforecast/1.9/?{0};{1}" # start of url string 
     lat = "lat={}".format(y)      # creates the latititue part of the url string 
     lon = "lon={}".format(x)      # creates the longitude part of the url string 
     text = url.format(lat, lon)      # combines the strings together to create a new url 
     response = requests.get(text).text    # get the url into text format       
     winds= bs4.BeautifulSoup(response, "xml")  # uses BeautifulSoup to make an xml file 
     wind_all = winds.find_all("windSpeed")   # finds the "windSpeed" element 
     speed = wind_all[0].get("mps")     # finds the first "mps" attribute 
     wind_dir = winds.find_all("windDirection")  # finds the "windDirection" element 
     wind_dirs = wind_dir[0].get("deg")    # finds the "deg" attribute 

     rows.append(speed)        # append speed value 
     rows.append(wind_dirs)       # append wind value 
     writer.writerow(rows)       # write new row 

入力(latlon.csv)

1 54 -122 
2 53 -112 
3 52 -102 

出力(wind2.csv)

1 54 -122 1.3 16.2 
2 53 -112  4 330.7 
3 52 -102 4.9 314.1 
+0

それはすごくうまくいった、私は何を複雑にすることを試みていたのかわからない。ありがとうございました。 –

関連する問題