我有一个大的csv文件而不是浮点数,整数和字符串,只使用我需要确定数据类型的csv模块,然后在包含数字的列上执行模式,平均值等计算。到目前为止我有这个:
import csv
file = open('adult.csv')
reader = csv.reader(file)
filename = 'output.xml'
text = open(filename, 'w')
text.write('<?xml version="1.0"?>')
text.write('<!DOCTYPE summary [')
def getType2(value):
try:
float(value)
if "." in value:
print 'float',
return 'float'
else:
print 'int',
return 'int'
except ValueError:
print 'str',
headers = reader.next()
length= len(headers)
print length
i=0
while i<length:
print '<name>',
print headers[i],
print '</name>'
print '<type>',
value = reader.next()
if getType2(value[i]) == 'int':
data =[]
total =0
for row in reader:
data.append(float(row[i]))
total += int(row[i])
print total
print '</type>\n\n'
print
i= i+1
print '<!ELEMENT summary\n\n>'
这正确地确定了数据类型,并且会正确地执行第一列,但是我得到索引错误,它不会移动到下一列。
非常确定我这样做是一种非常复杂的方式,因为必须有一种更简单的方法来处理这个问题。
答案 0 :(得分:0)
它仅适用于第一列的原因是因为您迭代csv reader对象的方式:
你有一个while
循环,你打算迭代列,但在该循环内,就在if
- 子句之前,你也是每次调用reader.next()
,将返回文件中的下一个行。这意味着如果它不是if
- 子句中发生的操作,那么您只会检查此csv文件对角线上的元素。在if
- 子句中,您将迭代文件中的所有行,读取器对象是迭代器,这意味着一旦您获得了一个元素(例如,线路),没有办法再次获得它(你不能跳回到第1行,例如,如果你已经看过第2行)。
您当前的做法确实有点令人费解。如果要处理整个文件并对所有列进行操作,则必须将整个文件加载到内存中并为其生成有效的数据结构。
如果您正在处理的数据文件是一个表现良好的csv文件,那么最好使用numpy.genfromtxt
,这将返回一个具有mean
等方法的numpy对象。它用于数值计算。您还可以查看提供类似功能的pandas
。使用这些库会阻止您重新发明轮子。
将数据集加载到pandas数据框或numpy数组中后,您可以轻松完成剩余的数值处理,并继续将所需的值写入输出文件。有关如何在链接底部使用np.genfromtxt
的示例,这应该有助于您入门。