-1

由于某种原因,我无法在我的家用计算机上登录与我的工作计算机相同的帐户。
我能够让 Bo10 的代码工作,但不是 abernert 的,我真的很想知道为什么。

这是我对 abernert 代码的更新:

    import csv
    import sys
    import json
    import urllib2

    j = urllib2.urlopen('https://citibikenyc.com/stations/json')
    js = json.load(j)

    citi = js['stationBeanList']

    columns = ('stationName', 'totalDocks', 'availableDocks', 
               'latitude', 'longitude', 'availableBikes')
    stations = (operator.itemgetter(columns)(station) for station in citi)

    with open('output.csv', 'w') as csv_file:
        csv_writer = csv.writer(csv_file)
        csv_file.writerows(stations)

I thought adding this line `csv_writer = csv.writer(csv_file)` would fix the object has no attirbute error, but I am still getting it.  This is the actual error:

Andrews-MacBook:coding Andrew$ python citibike1.py
Traceback (most recent call last):
  File "citibike1.py", line 17, in <module>
    csv_file.writerows(stations)
AttributeError: 'file' object has no attribute 'writerows'

所以现在我已经将代码更改为这个,输出只是重复列名 322 次。我在第 14 行更改了它,因为我收到了这个错误:

Traceback (most recent call last):
  File "citibike1.py", line 17, in <module>
    csv_writer.writerows(stations)
  File "citibike1.py", line 13, in <genexpr>
    stations = (operator.itemgetter(columns)(station) for station in citi)
NameError: global name 'operator' is not defined: 

import csv
import sys
import json
import urllib2
import operator

j = urllib2.urlopen('https://citibikenyc.com/stations/json')
js = json.load(j)

citi = js['stationBeanList']

columns = ('stationName', 'totalDocks', 'availableDocks', 
           'latitude', 'longitude', 'availableBikes')
stations = (operator.itemgetter(0,1,2,3,4,5)(columns) for station in citi)

with open('output.csv', 'w') as csv_file:
    csv_writer = csv.writer(csv_file)
    csv_writer.writerows(stations)
4

2 回答 2

1

问题是你没有使用csv模块,你正在使用pickle模块,这就是pickle输出的样子。

要解决这个问题:

csvfile = open('output.csv', 'w')
csv.writer(csvfile).writerows(stationList)
csvfile.close()

请注意,您将不遗余力地构建一个转置表,其中包含 322 个列表的 6 个列表,而不是 6 个列表的 322 个列表。因此,您将获得 6 行,每行 322 列。如果您想要相反,请不要这样做:

stationList = []
for f in citi:
    stationList.append((f['stationName'],
                        f['totalDocks'],
                        f['availableDocks'],
                        f['latitude'],
                        f['longitude'],
                        f['availableBikes']))

或者,更简单地说:

stationlist = map(operator.itemgetter('stationName', 'totalDocks', 'availableDocks',
                                      'latitude', 'longitude', 'availableBikes'),
                  citi)

但是,您可能需要考虑一次写入一行,而不是建立一个巨大的列表。

您可以通过将csv.writerow调用放入 for 循环的中间来做到这一点。

但是您也可以通过使用itertools.imapor 生成器表达式而不是mapor 列表推导来做到这一点。这将stationlist变成一个可迭代的,根据需要创建新值,而不是一次创建它们。


综上所述,这就是我编写程序的方式:

import csv
import sys
import json
import urllib2

j = urllib2.urlopen('https://citibikenyc.com/stations/json')
js = json.load(j)

citi = js['stationBeanList']

columns = ('stationName', 'totalDocks', 'availableDocks', 
           'latitude', 'longitude', 'availableBikes')
stations = (operator.itemgetter(columns)(station) for station in citi)

with open('output.csv', 'w') as csv_file:
    csv.writer(csv_file).writerows(stations)
于 2013-06-27T00:06:03.193 回答
0

正如 abarnert 所提到的,您实际上并没有使用csv您导入的模块。

此外,您存储列的逻辑实际上可能已被转置。我认为您可能想要这样做(编辑以修复元组/列表混淆):

import csv
import json
import urllib2

j = urllib2.urlopen('https://citibikenyc.com/stations/json')
js = json.load(j)

citi = js['stationBeanList']

columns = ["stationName", "totalDocks", "availableDocks", "latitude", "longitude", "availableBikes"]
station_list = [[f[s] for s in columns] for f in citi]

with open("output.csv", 'w') as outfile:
  csv_writer = csv.writer(outfile)
  csv_writer.writerows(station_list)
于 2013-06-27T00:09:37.377 回答