我是Python的新手,我正试图将我创建的excel求解器模型“迁移”到Python中,希望能有更高效的处理时间。
我收到一张.csv表,我用作模型的输入,它总是采用相同的格式。
该模型主要使用与产品A,B和C相关的4个不同指标,我基本上确定了如何相应地定价A,B和C.
我正处于将这些数据有效输入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]。
我们非常感谢您的帮助,对我的方法提出的任何建议都非常受欢迎。
提前致谢!
答案 0 :(得分:1)
使用print()
可以成为您的朋友:
import csv
with open('141881.csv') as file_handle:
file_reader = csv.reader(file_handle)
for row in file_reader:
print(row)
上面的代码将打印出每一行。
要打印出第一行,请将for
循环替换为:print(file_reader.__next__())
(假设Python3)
打印出行可以让你看到"行"是
P.S。
建议使用with
,因为它会为您处理文件的打开和关闭
答案 1 :(得分:1)
查看pandas。
将文件读取为:
data = pd.read_csv('141881.csv'))
阅读专栏:
col = data.columns['column_name']
读一行:
row = data.ix[row_number]
答案 2 :(得分:0)
读取csv的python模块将输入的每一行转换为一个列表。 对于每一行,它会将行拆分为单元格列表。换句话说,一个数组由excel电子表格中的列数组成。
尝试终端:
>>> f = open("141881.csv")
>>> print csv.reader(f)
>>>[["id", "name", "company", "email"],[1563, "defoe", "SuperFastCompany",],["def@superfastcie.net"],[1564, "doe", "Awsomestartup", "doe@awesomestartup"], ...]`
这就是为什么你遍历电子表格的行,将值分配给一个新变量。
我建议您阅读list manipulation的基础知识。
但是...
如果一个单元格为空或一行的列数少于其他单元格,则会产生错误。如你所描述的。 IndexError意味着Python无法为此特定单元格找到值。换句话说,如果你的excel电子表格的某些行小于另一行,它会说没有这样的值来签名并抛出索引错误。知道如何捕获异常的原因对于查看问题非常有用。如果不为例如
分配空值,请尝试验证每个列表的长度是否相同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文件中的人分配无值来跳过错误
您可以阅读有关Catching Exception
的更多信息答案 3 :(得分:0)
感谢大家的意见 - 打印结果让我意识到我得到了IndexError,因为第一行只有标题。跳过那一行摆脱了错误。
我会调查大熊猫,看起来这对我正在做的工作类型很有用。
再次感谢您的帮助,非常感谢。