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)写入两列,并且下一次迭代会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 回答