for循环中的TypeError

时间:2013-07-11 16:23:11

标签: python for-loop typeerror

我遇到了一些代码问题,我有一个包含633,986元组的文本文件,每个元组有3个值(例如:第一行是-0.70,0.34,1.05)。我想创建一个数组,我在其中获取元组中3个值的大小,因此对于元素a,b,c,我想要magnitude = sqrt(a^2 + b^2 + c^2)

但是,我的代码中出现错误。有什么建议吗?

import math
fname = '\\pathname\\GerrysTenHz.txt'
open(fname, 'r')

Magn1 = [];
for i in range(0, 633986):
    Magn1[i] = math.sqrt((fname[i,0])^2 + (fname[i,1])^2 + (fname[i,2])^2)

TypeError: string indices must be integers, not tuple

3 个答案:

答案 0 :(得分:1)

您需要正确打开文件(使用打开的文件对象和csv模块来解析逗号分隔的值),读取每一行并将字符串转换为float个数字,然后应用正确的公式:

import math, csv

fname = '\\pathname\\GerrysTenHz.txt'
magn1 = []

with open(fname, 'rb') as inputfile:
    reader = csv.reader(inputfile)
    for row in reader:
        magn1.append(math.sqrt(sum(float(c) ** 2 for c in row)))

可以通过列表理解简化为:

import math, csv

fname = '\\pathname\\GerrysTenHz.txt'

with open(fname, 'rb') as inputfile:
    reader = csv.reader(inputfile)
    magn1 = [math.sqrt(sum(float(c) ** 2 for c in row)) for row in reader]

with语句将打开的文件对象分配给inputfile,并确保在代码块完成后再次关闭。

我们将列值的平方与sum()相加,后者生成一个生成器表达式,在将其平方后将每列转换为float()

答案 1 :(得分:0)

您需要使用文件的行和csv模块(如Martijn Pieters指出的那样)来检查每个值。这可以通过列表理解和with

来完成
with open(fname) as f:
        reader = csv.reader(f)
        magn1 = [math.sqrt(sum(float(i)**2 for i in row)) for row in reader]

只需确保import csv


为了解释你所遇到的问题(有很多),我将通过一种更加明确的方式来解决这个问题。

您需要使用open返回的内容。 open接受一个字符串并返回一个文件对象。

f = open(fname)

我假设你的for循环中的范围假设是文件中的行数。您可以逐个遍历文件的每一行

for line in f:

然后要获取每行的数字,请使用str.split方法在逗号上分割行

    x, y, z = line.split(',')

将所有三个转换为float,以便您可以使用它们进行数学计算

    x, y, z = float(x), float(y), float(z)

然后使用**运算符提升功率,并取三个数字之和的sqrt。

    n = math.sqrt(x**2 + y**2 + z**2)

最后使用append方法添加到列表的后面

    Magn1.append(n)

答案 2 :(得分:-1)

让我们看看fname。那是一个字符串。因此,如果您尝试下标它(即fname[i, 0]),您应该使用一个整数,然后您将返回索引i处的字符。由于您使用[i, 0]作为字符串索引,因此您传递了一个元组。那不是整数!

真的,你应该从文件中读取一行,然后用它来处理。所以,

with(open(fname, 'r')) as f: # You're also opening the file and doing nothing with it
    for line in f:
        print('doing something with %s' % line)