0

我在处理一些代码时遇到问题,我有一个包含 633,986 个元组的文本文件,每个元组有 3 个值(例如:第一行是-0.70,0.34,1.05)。我想创建一个数组,在其中获取元组中 3 个值的大小,因此对于 elements 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
4

3 回答 3

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()

于 2013-07-11T16:31:08.307 回答
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(',')

将所有三个转换为floats,以便您可以对它们进行数学运算

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

然后用**运算符求幂,取三个数之和的sqrt。

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

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

    Magn1.append(n)
于 2013-07-11T16:29:59.630 回答
-1

让我们看看fname。那是一个字符串。所以如果你尝试给它下标(即fname[i, 0]),你应该使用一个整数,你会得到 index 处的字符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)
于 2013-07-11T16:28:57.150 回答