如何使用urllib编辑csv文件?
问题描述:
我想从雅虎财经打开历史股票报价时下载和操作csv文件。如何使用urllib编辑csv文件?
的CSV文件看起来像一个短暂的一瞥:
Date,Open,High,Low,Close,Volume,Adj Close
2012-11-30,691.31,699.22,685.69,698.37,3163600,698.37
2012-11-29,687.78,693.90,682.00,691.89,2776500,691.89
2012-11-28,668.01,684.91,663.89,683.67,3042000,683.67
我希望创建一个擦除字码“开放,高,低,关闭,音量调”,数据在其下面,并且还添加了两个新栏目,给我:
Date Close [Insert new column here] [Another column]
2012-11-30 698.37 ---some data---- ---some data----
2012-11-29 691.89 ---some data---- ---some data----
2012-11-28 683.67 ---some data---- ---some data----
我在使用Python初学者,所以我有一点麻烦编写这些代码。如果有人能帮助我,我会非常感激。
到目前为止,这是我所拥有的,尽管它没有按照我希望的方式工作。
def _download_url(url):
response = None
try:
response = urllib.request.urlopen(url)
content_bytes=response.read()
content_string=content_bytes.decode(encoding='utf-8')
data = io.StringIO(content_string)
mycsv=csv.reader(data)
for row in mycsv:
if row:
print(row[0],row[6])
此代码打印出来(一个短暂的一瞥):
Date Adj Close
2012-11-30 698.37
2012-11-29 691.89
2012-11-28 683.67
2012-11-27 670.71
这是一种我想要什么,但我想删除“ADJ”,并添加两个新列。 谢谢!
答
之前创建data
,调整content_string
删除“调”:
content_string=content_bytes.decode(encoding='utf-8')
content_string = content_string.replace('Adj ', '')
data = io.StringIO(content_string)
至于添加列,它是由你在print
声明中这样做。
答
我恰好是DictReader
类的csv
一个巨大的风扇,因为它需要所有的猜测解析csv
S的(没有更多的索引!):
mycsv = csv.DictReader(data)
print('{:<11} {:<8} {:<12} {:<12}'.format('Date', 'Close', 'Col1', 'Col2'))
for row in mycsv:
print('{:<11} {:<8} {:<12} {:<12}'.format(row['Date'], row['Adj Close'], '123', '456')
第一print
打印出的头行,第二个print
打印出每一行(请注意DictReader
将使用CSV中的标题行)。 {:<11} {:<8} {:<12} {:<12}
使用指定大小的整齐固定列格式化数据。
答
如果您还没有结合您的设计,我建议您查看pandas。它使这样的东西比其他方式容易得多。获取数据:
>>> from pandas.io.data import DataReader
>>> apple = DataReader("AAPL", "yahoo")
>>> apple
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 786 entries, 2010-01-04 00:00:00 to 2013-02-15 00:00:00
Data columns:
Open 786 non-null values
High 786 non-null values
Low 786 non-null values
Close 786 non-null values
Volume 786 non-null values
Adj Close 786 non-null values
dtypes: float64(5), int64(1)
>>> apple[:5]
Open High Low Close Volume Adj Close
Date
2010-01-04 213.43 214.50 212.38 214.01 17633200 210.90
2010-01-05 214.60 215.59 213.25 214.38 21496600 211.26
2010-01-06 214.38 215.23 210.75 210.97 19720000 207.90
2010-01-07 211.75 212.00 209.05 210.58 17040400 207.52
2010-01-08 210.30 212.00 209.06 211.98 15986100 208.90
添加新列:
>>> apple["new_column"] = apple["Open"]/apple["Volume"]**0.3 + 5
>>> apple[:5]
Open High Low Close Volume Adj Close new_column
Date
2010-01-04 213.43 214.50 212.38 214.01 17633200 210.90 6.430066
2010-01-05 214.60 215.59 213.25 214.38 21496600 211.26 6.354936
2010-01-06 214.38 215.23 210.75 210.97 19720000 207.90 6.389032
2010-01-07 211.75 212.00 209.05 210.58 17040400 207.52 6.433440
2010-01-08 210.30 212.00 209.06 211.98 15986100 208.90 6.451164
只选择我们需要的列:
>>> new = apple[["Close", "new_column"]]
>>> new[:5]
Close new_column
Date
2010-01-04 214.01 6.430066
2010-01-05 214.38 6.354936
2010-01-06 210.97 6.389032
2010-01-07 210.58 6.433440
2010-01-08 211.98 6.451164
等等。
我尝试过这样做,但是如何在刚刚添加的新列下添加不同的数据? '123'和'456'似乎在这些列下面重复,但我希望它是不同的值。 – Kara 2013-02-18 07:05:22
好吧,当然你必须用''print''替换'print'中的'123'和'456'! – nneonneo 2013-02-18 09:00:53
不,我说的是当我在打印语句中替换'123'和'456'时,当我想要'123''345''567'时,它在每列'123 123 123'下重复相同的值。这只是重复 – Kara 2013-02-18 19:15:00