我遇到了一些代码问题,我有一个包含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
答案 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)