从C到Python
如果这是一个蹩脚的问题,我真的很抱歉,但我认为这可能有助于其他人从C向Python进行同样的转换。我有一个我开始用C编写的程序,但我认为最好是用Python编写,因为它只会让我的生活更轻松 我的程序从雅虎检索日内股票数据!融资并将其存储在结构中。因为我已经习惯了用C语言编程,所以我通常会尝试用艰难的方式来做事情。我想知道的是,以一种有组织的方式存储数据的最“Pythonesque”的方式是什么。我在想一个元组数组 这里有一点我的C程序从C到Python,python,c,Python,C,如果这是一个蹩脚的问题,我真的很抱歉,但我认为这可能有助于其他人从C向Python进行同样的转换。我有一个我开始用C编写的程序,但我认为最好是用Python编写,因为它只会让我的生活更轻松 我的程序从雅虎检索日内股票数据!融资并将其存储在结构中。因为我已经习惯了用C语言编程,所以我通常会尝试用艰难的方式来做事情。我想知道的是,以一种有组织的方式存储数据的最“Pythonesque”的方式是什么。我在想一个元组数组 这里有一点我的C程序 // Parses intraday stock quote
// Parses intraday stock quote data from a Yahoo! Finance .csv file.
void parse_intraday_data(struct intraday_data *d, char *path)
{
char cur_line[100];
char *csv_value;
int i;
FILE *data_file = fopen(path, "r");
if (data_file == NULL)
{
perror("Error opening file.");
return;
}
// Ignore the first 15 lines.
for (i = 0; i < 15; i++)
fgets(cur_line, 100, data_file);
i = 0;
while (fgets(cur_line, 100, data_file) != NULL) {
csv_value = strtok(cur_line, ",");
csv_value = strtok(NULL, ",");
d->close[i] = atof(csv_value);
csv_value = strtok(NULL, ",");
d->high[i] = atof(csv_value);
csv_value = strtok(NULL, ",");
d->low[i] = atof(csv_value);
csv_value = strtok(NULL, ",");
d->open[i] = atof(csv_value);
csv_value = strtok(NULL, "\n");
d->volume[i] = atoi(csv_value);
i++;
}
d->close[i] = 0;
d->high[i] = 0;
d->low[i] = 0;
d->open[i] = 0;
d->volume[i] = 0;
d->count = i - 1;
i = 0;
fclose(data_file);
}
问题是,在Python中存储这些数据的最佳或最优雅的方式是什么?我相信这取决于在检索数据后要进行多少数据操作。 例如,如果您计划只在屏幕上打印它们,那么元组数组就可以了 但是,如果您需要能够排序、搜索和其他类型的数据操作,我相信自定义类会有所帮助:然后您可以使用自定义对象的列表(甚至是自制容器),允许您根据需要轻松添加自定义方法
请注意,这只是我的观点,我不是一名高级Python开发人员。Pandas()特别适合这一点。Numpy级别稍低,但也可能适合您的目的。不过,我真的建议你走熊猫路线。无论哪种方式,你都不应该损失太多C的速度,所以这是一个加号。保持简单。读取行,用逗号分隔,并将值存储在(
命名的)元组中。这非常接近于在C中使用struct
如果您的程序变得更加复杂,用类替换元组可能是有意义的,但不是立即
这里有一个提纲:
from collections import namedtuple
IntradayData = namedtuple('IntradayData',
['close', 'high', 'low', 'open', 'volume', 'count'])
response = urllib2.urlopen('https://www.google.com/finance/getprices?q=AAPL')
result=response.read().split('\n')
result = result[15 :] # Your code does this, too. Not sure why.
all_data = []
for i, data in enumerate(x):
if data == '': continue
c, h, l, o, v, _ = map(float, data.split(','))
all_data.append(IntradayData(c, h, l, o, v, i))
那么你在使用雅虎的财务API?在您的代码示例中,您使用的是不再存在的google财务API。您的结构是什么样子的?@Alex对我来说很好。;-)是的,谷歌金融方法仍然有效,尽管网站说它已经不存在了。谢谢你的建议。是的,在第一段代码中,我从一个Yahoo!财务csv文件,以15行非实际数据开头。
from collections import namedtuple
IntradayData = namedtuple('IntradayData',
['close', 'high', 'low', 'open', 'volume', 'count'])
response = urllib2.urlopen('https://www.google.com/finance/getprices?q=AAPL')
result=response.read().split('\n')
result = result[15 :] # Your code does this, too. Not sure why.
all_data = []
for i, data in enumerate(x):
if data == '': continue
c, h, l, o, v, _ = map(float, data.split(','))
all_data.append(IntradayData(c, h, l, o, v, i))