如何让脚本遍历每一行txt文件并执行一个函数?
我想写一个script
,它会经历txt-file
中的每个股票代码,并通过googlefinance
运行以收集其所有历史数据并将其输出到CSV-file
。我知道这应该不是那么困难,但我似乎无法弄清楚我在这段代码中做错了什么。它适用于第一支股票,然后崩溃。我有一个假设,它与\n
有关,但我尝试了splitlines()
函数和其他一些东西。如何让脚本遍历每一行txt文件并执行一个函数?
我的代码:
import datetime as dt
import matplotlib.pyplot as plt
from matplotlib import style
from matplotlib.finance import candlestick_ohlc
import matplotlib.dates as mdates
import pandas as pd
import pandas_datareader.data as web
from googlefinance import getQuotes
import json
from datetime import datetime
from forex_python.converter import CurrencyRates
from yahoo_finance import Share
sp500 = open('sp500tickers.txt').read().splitlines()
for x in sp500:
share = Share(sp500[x])
print (share.get_price())
start = dt.datetime(2001,1,1)
end = dt.datetime(2017,1,1)
df = web.DataReader(share, 'google', start, end)
df.to_csv(''+x+'.csv', parse_dates=True, index_col=0)
文本文件:
MMM
ABT
ABBV
ACN
ATVI
AYI
ADBE
AAP
AES
AET
AMG
AFL
A
APD
AKAM
ALK
ALB
ALXN
ALLE
AGN
ADS
LNT
ALL
GOOGL
GOOG
MO
AMZN
AEE
AAL
...
编辑的代码:
with open('p1.txt', 'r') as f:
for line in f:
line = line.rstrip()
share = Share(line)
style.use('ggplot')
print (share.get_price())
start = dt.datetime(2001,1,1)
end = dt.datetime(2017,1,1)
df = web.DataReader(share, 'google', start, end)
df.to_csv(''+line+'.csv', parse_dates=True, index_col=0)
在你的for-loop
中,x不是一个迭代器。 x是本身的价值,所以改变这一行:
share = Share(sp500[x])
到
share = Share(x)
和在读取文件时,你可以一次读取每一行,而不是读一下子,如下:
with open(file, 'r') as f:
for line in f:
line = line.rstrip()
#your code
你能帮助我完成该函数的第二部分吗?所以它很容易检索价格,但我得到了一些错误..在txt文件的308行后,我得到一个HTTP错误,所以我假设我称之为一个机器人的网站我看它。但我主要关心的是这个错误:'返回(seq [pos:pos + size]为范围内的pos(0,len(seq),size)) TypeError:'Share'类型的对象没有len()' - 当我试图将所有的历史数据转换为CSV时返回。我怎样才能解决这个问题? – sgerbhctim
什么是'seq'?你可以发布整个功能吗? –
我没有在我的函数中的任何地方写seq。我假设这与我使用的软件包有关。我的功能正是我现在所拥有的功能。 – sgerbhctim
1)你做什么,在这里:
sp500 = open('sp500tickers.txt').read().splitlines()
正在读取整个文件到内存,这对于大文件坏主意 - 做这个:在这行
with open('sp500tickers.txt') as sp500:
2):
share = Share(sp500[i])
哪里呢i
来自?
对不起,应该是x。我上传了我的代码的早期版本。现在解决。 – sgerbhctim
仍然错误。 'x' **是**文本文件中的行,而不是索引。它应该只是'share = Share(x)' –
好吧,让每个价格都在工作吧。现在我的问题变成了 - 为什么历史数据无法收集? – sgerbhctim
由于您已经在使用'pandas',为什么不使用'pd.read_csv()'? –
含义...?将我的代号列表变成csv然后运行它?我最终会遇到同样的问题。 – sgerbhctim
您的tickers列表是一个txt文件。一个txt文件可以通过'read_csv()'导入。你已经在构建价格的数据框,所以我不明白为什么要多步完成。 –