版:
我正在尝试迭代公司的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]的迭代。
如何进行此类迭代和计算?
(很抱歉这是混乱。这是我第一次编码和使用这项公共服务,所以在传达我的问题时出现了一些意想不到的错误。)
答案 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中当前的伪代码无法表达这一点。也许您想要进行计算,而不是total
和thelist[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