如何使用urllib编辑csv文件?

2024-05-01 21:47:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我想下载和操作一个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

我想创建一个代码,删除单词“open,High,Low,Close,Volume,Adj”及其下面的数据,并添加两个新列,给我:

^{pr2}$

我是一个使用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”并添加两个新列。 谢谢您!在


Tags: 文件csv代码urlclosedatestringbytes
3条回答

如果您还没有专注于自己的设计,我建议您看看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

添加新列:

^{pr2}$

只选择我们想要的列:

^{3}$

等等。在

我碰巧是csv中的DictReader类的超级粉丝,因为它省去了解析csvs的所有猜测(没有更多的索引!)公司名称:

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

在创建data之前,请调整content_string以删除“Adj”:

content_string=content_bytes.decode(encoding='utf-8')
content_string = content_string.replace('Adj ', '')
data = io.StringIO(content_string)

至于添加列,您可以在print语句中这样做。在

相关问题 更多 >