将CSV数据映射到Python

我是Python的新手,我试图将我已经创build的一个Excel解算器模型“迁移”到Python中,希望得到更高效的处理时间。

我收到一个.csv表单,我用它作为模型的input,它总是以相同的格式。

这个模型基本上使用与产品A,B和C相关的4个不同的度量标准,并且本质上决定如何相应地定价A,B和C.

我正处于将这些数据有效input到Python的初级阶段。 这就是我所拥有的,如果有更好的方法,我也不会感到惊讶,所以开放的尝试任何你退伍军人必须推荐!

import csv f = open("141881.csv") for row in csv.reader(f): price = row[0] a_metric1 = row[1] a_metric2 = row[2] a_metric3 = row[3] a_metric4 = row[4] b_metric1 = row[7] b_metric2 = row[8] b_metric3 = row[9] b_metric4 = row[10] c_metric1 = row[13] c_metric2 = row[14] c_metric3 = row[15] c_metric4 = row[16] 

.csv文件格式为price,a_metric1,a_metric2,a_metric3,a_metric4,price,b_metric1,b_metric2,b_metric3,b_metric4,price,c_metric1,c_metric2,c_metric3,c_metric4

我跳过第二个和第三个价格栏,因为它们与第一个相同。

但是,当我运行python脚本,我得到以下错误:

  c_metric1 = row[13] IndexError: list index out of range 

我不知道为什么会发生这种情况,当我可以看到数据在我自己的时候(在Excel中,这个.csv文件将一直到列Q,或者我理解为行[16]。

您的帮助表示赞赏,对我的方法的任何意见都比欢迎。

提前致谢!

使用print()可以成为你的朋友在这里:

 import csv with open('141881.csv') as file_handle: file_reader = csv.reader(file_handle) for row in file_reader: print(row) 

上面的代码将打印出每行。

要只打印第一行,用下面的代码replacefor循环: print(file_reader.__next__()) (假设Python3)

打印行可以让你看到究竟是一个“行”。

PS使用withbuild议,因为它为您处理文件的打开和closures

看看pandas 。

读取文件为:

 data = pd.read_csv('141881.csv')) 

阅读栏目:

 col = data.columns['column_name'] 

读一行:

 row = data.ix[row_number] 
  • Python中的CSV模块将电子表格转换为matrix: 列表列表

python模块读取csv将input的每一行转换为一个列表。 对于每一行,它将把行分割成一个单元格列表。换句话说,一个数组是由你的excel电子表格组成的。

尝试在terminal:

 >>> f = open("141881.csv") >>> print csv.reader(f) >>>[["id", "name", "company", "email"],[1563, "defoe", "SuperFastCompany",],["def@superfastcie.net"],[1564, "doe", "Awsomestartup", "doe@awesomestartup"], ...]` 

所以这就是为什么你迭代你的电子表格的行分配值到一个新的variables。

我build议你阅读列表操作的基本知识。

但…

  • 什么是IndexError ? 捕捉exception:

如果一个单元格是空的,或者一行的列数less于其他列表,则会产生一个错误。 如你所描述的。 IndexError表示Python无法为此特定单元格find值。 换句话说,如果您的Excel电子表格中的某行比另一行更小,则表示不存在这样的值,并且抛出索引错误。 那为什么知道如何捕捉exception可以看到这个问题是非常有用的。 尝试validation每个列表都具有相同的长度,例如,如果没有分配一个空值

 try: #if row has always 17 cells with values #I can just assign it directly using a little trick price,a_metric1,a_metric2,a_metric3,a_metric4,,price,b_metric1,b_metric2,b_metric3,b_metric4,price,c_metric1,c_metric2,c_metric3,c_metric4 = row' except IndexError: # if there is no 17 cells # tell me how many cells is actually in the list # you will see there that there less than 17 elements print len(row) 

现在,您可以通过将“无”值分配给没有出现在csv文件中的人来跳过该错误

你可以阅读更多关于捕捉exception

感谢大家的input – 打印结果让我意识到,我得到了IndexError因为第一行,只有头。 跳过那一行摆脱了错误。

我会研究pandas,看起来对于我正在做的工作types是有用的。

再次感谢您的帮助,非常感谢。