2013-07-11 2 views
0

У меня возникли проблемы с некоторым кодом, где у меня есть текстовый файл с 633,986 кортежами, каждый из которых имеет 3 значения (пример: первая строка - -0.70,0.34,1.05). Я хочу создать массив, где я беру величину 3 значения в кортеже, поэтому для элементов a,b,c, я хочу magnitude = sqrt(a^2 + b^2 + c^2).TypeError in for loop

Однако, я получаю сообщение об ошибке в своем коде. Любой совет?

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

Вы не читаете этот файл. 'open (fname, 'r')' ** возвращает ** новый объект открытого файла, который вы игнорируете. Вы не читаете этот открытый файл. Что вы ожидаете от 'fname [i, 0]' и т. Д., Чтобы дать вам? Это неправда Python (вернее, это, но не делать то, что вы ожидаете от этого, «i, 0» рассматривается как кортеж, следовательно, исключение). –

+0

Оператор экспоненциальности также '**' не '^'. 'x = 2 ** 3' устанавливает' x' в '8'. – Brian

+0

И '^' - оператор XOR, а не оператор экспоненты ('**'). –

ответ

0

Вы должны использовать строки файла и csv модуля (как Мартейн Питерс указывает) для изучения каждого значения. Это может быть сделано с помощью списка понимания и 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 s, так что вы можете сделать математику с ними

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

Затем используйте оператор ** поднять на власть, и взять SQRT из сумма трех чисел.

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

Наконец использовать метод append добавить к задней части списка

Magn1.append(n) 
-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) 
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))) 

, которые могут быть си mplified с пониманием список к:

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() перед его возведением в квадрат.

+0

Вы имели в виду 'for row in reader'? –

+0

Да, я действительно. –