如何使用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}使用指定大小的整齐固定列格式化数据。

+0

我尝试过这样做,但是如何在刚刚添加的新列下添加不同的数据? '123'和'456'似乎在这些列下面重复,但我希望它是不同的值。 – Kara 2013-02-18 07:05:22

+0

好吧,当然你必须用''print''替换'print'中的'123'和'456'! – nneonneo 2013-02-18 09:00:53

+0

不,我说的是当我在打印语句中替换'123'和'456'时,当我想要'123''345''567'时,它在每列'123 123 123'下重复相同的值。这只是重复 – Kara 2013-02-18 19:15:00

如果您还没有结合您的设计,我建议您查看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 

等等。