如何迭代CSV并使用它进行计算

时间:2015-01-27 14:55:36

标签: python csv python-3.4

版:

我正在尝试迭代公司的CSV文件来做一些股票价格的计算,但似乎无法得到它。假设我有这个CSV文件:

List.csv

Date,Quantity,Price
20150101,2,1
20150102,10,3
20150103,4,2
20150104,5,4

我希望能够进行以下计算:

(pseudo-code)
if List [2] [2] < List [1] [2]:
# to check if 20150103's Price (2) is smaller than 20150102's Price (3)

如果是,那么......

Total = List [2] [2] * List [1] [2]
# which is 2 * 3 = 6, or any other calculation as necessary

当然会有从List [0]到List [-1]的迭代。

如何进行此类迭代和计算?

(很抱歉这是混乱。这是我第一次编码和使用这项公共服务,所以在传达我的问题时出现了一些意想不到的错误。)

2 个答案:

答案 0 :(得分:0)

你似乎不想像你说的那样想要迭代,因为你正在使用不同的行进行计算,实际上在你的伪代码中你正在调用数据{ {1}},暗示它同时存在于记忆中。

没关系,只要CSV文件太大而不适合。我还看到一些列是字符串,一些是整数,所以你在某处需要这个指示,比如一个类型的元组:

List

对应每列,types = int, None, int, int 含义&#34;单独留下&#34; (作为清单)。

所以,鉴于此......:

None

现在在import csv thelist = [] with open('the.csv', 'rb') as f: r = csv.reader(f) for fields in r: sublist = [f if t is None else t(f) for t, f in zip(types, fields)] thelist.append(sublist) 中,您拥有适当类型的所有值,因此您想要的计算很容易转换:

thelist

现在在评论中你坚持要想要迭代,在这种情况下,上面的限制没有多大意义,并且完全不明显应该保留if thelist[2][2] < thelist[1][2]: total = thelist[2][3] * thelist[1][3] 以及在哪里迭代继续进行。

因此,您应该明确说明您的伪代码以表达您实际上想要的内容,因为您Q中当前的伪代码无法表达这一点。也许您想要进行计算,而不是totalthelist[2],而是&#34;当前子列表&#34;和&#34;以前的子列表&#34;,并将计算的总数放在列表中,而不是在每个新计算覆盖前一个计算的标量中(只是猜测你的秘密意图,因为我不是善于阅读)。在这种情况下,我可能会将代码重构为:

thelist[1]

等。澄清您的实际意图,并且可以调整任何一种代码以适应;或者,选择让他们神秘,但不要期望得到很多帮助。

请注意,在内存中读取整个文件的普遍担心通常是错误的;很少有应用程序实际上需要摄取千兆字节来完成他们的工作(它发生 - 比人们意识到的要少得多)。

因此,虽然知道如何迭代非常重要,但为了实际存在千兆字节的罕见情况,在现实生活中,通常可以在一个大吞吐量中摄取输入。开始,然后迭代那个列表。当然,您确实需要知道您的应用程序的确切操作参数才能做出决定。

答案 1 :(得分:0)

只要csv文件不是太大,你可以尝试:

>>> import pyexcel as pe
>>> list=pe.load("list.csv", name_columns_by_row=0)
>>> list.column.format('Price', int)
>>> list[2,2] * list[1,2]
6

可以改变以下声明:

Total = List [2] [2] * List [1] [2]

直观的:

Total = List ['20150103', 'Price'] * List ['20150103', 'Price']

再写一行代码:

>>> list.name_rows_by_column(0)

然后你可以这样做:

>>> list['20150103', 'Price'] * list['20150102', 'Price']
6

可以找到更多文档at read the docs