0

出力が5列の.csvになるようにスクリプトを作成しようとしています。2列のデータ、空の列、さらに2列のデータです。これが私が得たものであり、これが私が欲しいものです。完全を期すために、ここに私のすべてのコードがあります。

import requests
import csv

item_dictionary = {'10350': 'Third-Age Full', '560':'Death Rune'}
item_ids = item_dictionary.keys()
url_template = 'http://www.grandexchangecentral.com/include/gecgraphjson.php?jsid=%r'

sites = []
for i in range(0, len(item_ids)):
    result = url_template % item_ids[i]
    sites.append(result)


def data_grabber(item): 
    url = item
    r = requests.get(url, headers={'Referer': 'www.grandexchangecentral.com'})
    data = r.json  
    prices = [i[1] for i in data]
    return prices


data = map(data_grabber, sites)

names = item_dictionary.values()

def writer(item):
    q = data.index(item) 
    headers = [names[q], 'Percent Change', None]   
    a = data[q]
    percents = [100.0 * a1 / a2 - 100 for a1, a2 in zip(a[1:], a)]
    percents.insert(0, None)
    f = zip(data[q], percents)
    myfile = open('prices.csv', 'wb')
    wr = csv.writer(myfile)
    wr.writerow(headers)
    wr.writerows(f)
    myfile.close()

z = [writer(x) for x in data]

何が起こっているのかというwriter(item)と、2つの列が書き込まれ、次の反復でzそれらの列が上書きされると思います。編集:私myfile.close()は関数にあることに気づきました。それはそれを説明するでしょう、しかし私はそれを修正する方法を知りません。

4

2 に答える 2

0

ファイルを一度だけ開いてから、次のようにします。

wr = csv.writer(myfile)
wr.writerow(headers)
for x in data:
    # prepare row data
    # ... (the modified body of writer() function goes here)
    # write it as csv
    wr.writerow(row) # row is a list with 5 items
myfile.close()

'wb'モードでファイルを開くと、そのサイズはゼロに切り捨てられ、前のコンテンツは失われます。したがって、writer()関数を複数回呼び出すと、以前のすべてのコンテンツが置き換えられ、最後の呼び出しの行のみがファイルに残ります。

于 2012-11-04T04:47:03.290 に答える
0

このような非常に単純な CSV を作成している場合に限り、csvパッケージは実際には必要ありません。ファイルを開いて書き留めるだけです:

f = open("out.csv", "w")
...
for line in lines:
    //line = ["col1","col2","","col3",""]
    csv_line = str.join(",",line)
    f.writeline(csv_line)
f.close()

ただし、データがより複雑な場合 (つまり、純粋な数値ではない場合)、問題が発生します。

于 2012-11-04T04:15:41.123 に答える