将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使用with
build议,因为它为您处理文件的打开和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是有用的。
再次感谢您的帮助,非常感谢。