2

我正在尝试运行代码以从雅虎财经中提取数据。我没有收到任何错误,但我在计算机上的任何地方都找不到文件。任何人都可以帮忙吗?

谢谢,乔什

这就是我现在正在使用的,我得到了很多“哦,不”。我尝试使用数字 5 和数字 6。仍然没有:

import urllib2
import time

stockstoPull = 'CJES','BP','MSFT','TSLA','GOOG'

def pullData(stock):
    fileLine = '/Users/Josh/Documents/Python'+stock+'.txt'
    urltovisit ='http://chartapi.finance.yahoo.com/instrument/1.0/'+stock+'/chartdata;type=quote;range=1y/csv'
    sourceCode = urllib2.urlopen(urltovisit).read()
    splitSource = sourceCode.split('\n')

    for eachLine in splitSource:
        splitLine = eachLine.split(',')
        if len(splitLine) == 5:
            if 'values' not in eachLine:
                saveFile = open(fileLine,'a')
                linetoWrite = eachLine+'\n'
                saveFile.write(linetoWrite)
        else:
            print('oh no')

    print('Pulled', stock)
    print('...')
    time.sleep(.5)

for eachStock in stockstoPull:     
    pullData(eachStock)

已修复,感谢所有帮助的人。

4

5 回答 5

1

我在你的代码中发现了一个错误。我相信if len(splitLine) == 6:应该是if len(splitLine) == 5:

例如,如果您访问: http ://chartapi.finance.yahoo.com/instrument/1.0/CJES/chartdata;type=quote;range=1y/csv

并阅读您尝试拆分的第一行:20120904,19.2400,20.3900,19.1200,20.1500,901600

它实际上使用分隔符“.”拆分为一个 5 元素列表。20120904,19 2400,20 3900,19 1200,20 1500,901600

我修改了您的代码以在 Python 3.3.2 中运行,这对我有用并成功提取了所有股票数据。在我对您的代码进行更改之前,if len(splitLine) == 5:没有输入第一if条语句,因为len(splitLine)从来没有 6。

这是对我有用的代码。请注意,这是 Python 3.3,因此我必须更改一些内容才能使其正常工作,但它应该适用于您,使用与更改len(splitLine)事物相同的逻辑。

import urllib.request
import time

stockstoPull = 'CJES','BP','MSFT','TSLA','GOOG'

def pullData(stock):
    fileLine = stock+'.txt'
    urltovisit ='http://chartapi.finance.yahoo.com/instrument/1.0/'+stock+'/chartdata;type=quote;range=1y/csv'
    with urllib.request.urlopen(urltovisit) as f:
        sourceCode = f.read(100000).decode('utf-8')
    splitSource = sourceCode.split('\n')

    for eachLine in splitSource:
        splitLine = eachLine.split('.')
        if len(splitLine) == 5:
            if 'values' not in eachLine:
                saveFile = open(fileLine,'a')
                linetoWrite = eachLine+'\n'
                saveFile.write(linetoWrite)
        else:
            print('oh no')

    print('Pulled', stock)
    print('...')
    time.sleep(.5)

for eachStock in stockstoPull:     
    pullData(eachStock)
于 2013-09-04T04:43:25.730 回答
0

我猜你已经确定这stock是一个字符串。如果程序按预期运行,则文件应保存在与程序相同的目录中。

如果它没有按预期运行,您可以首先注意到您在 a 下创建文件try:,然后是 a for,然后是两个ifs。如果这些行中的任何一行没有按预期工作(例如sourceCode,没有按计划拆分,或者if不满足条件),则不会创建文件,因此无需查找它。首先测试这些行是否如您所愿。

此外,您似乎错过了以下缩进if len(splitLine) == 6:

于 2013-09-04T04:21:01.993 回答
0
In your data len(splitline) at most 5, So your if condition is false every time.


 if len(splitLine) == 6:
        if 'values' not in eachLine:
            saveFile = open(fileLine,'w')
            linetoWrite = eachLine+'\n'
            saveFile.write(linetoWrite)
so this line never executed and your file was not saved as
saveFile.write(linetoWrite) statement is inside the if condition.
于 2013-09-04T04:48:12.387 回答
0

您可以使用 find 命令查找您创建的文件:

sudo find / 'GOOG.txt'  

但是,请记住将绝对路径添加到您的 python 文件路径。在这种情况下:

fileLine = '/home/...'+ stock+'.txt'   # /home/... could be your home folder

(注意,如果您使用 Eclipse 之类的 IDE,您可能会在项目文件夹中找到这些文件)

于 2013-09-04T04:32:46.650 回答
0

如果您的文件名不正确,例如拼写错误或方向错误,它将不会保存文件或显示错误。您可以通过在 shell 中使用命令保存它来检查它,如果它有效,它将返回 True。如果没有,请检查您提交的文件和路径。该路径在保存之前必须存在。

于 2015-05-24T14:57:12.437 回答