2016-03-20 2 views
2

У меня был файл, содержащий данные о зарегистрированных наблюдениях видов, которые выложены в формате;Анализ данных из файла

«Вид», «\ т», «широта», «\ т», «Долгота»

мне нужно определить функцию, которая будет загружать данные из файла в списке, в то время как для каждого строка в списке, собирая ее на три компонента, название вида, широту и долготу.

Это то, что я имею, но он не работает:

def LineToList(FileName): 
    FileIn = open(FileName, "r") 
    DataList = [] 
    for Line in FileIn: 
     Line = Line.rstrip() 
     DataList.append(Line) 
     EntryList = [] 
     for Entry in Line: 
      Entry = Line.split("\t") 
      EntryList.append(Entry) 
    FileIn.close() 
    return DataList 

LineToList("Mammal.txt") 
print(DataList[1]) 

мне нужны данные по каждой строке должны быть разделены, так что я могу использовать его в дальнейшем для расчета, где вид находился в пределах определенного расстояния определенного местоположения.

Образец данных:

Myotis nattereri 54.07663633 -1.006446707 
Myotis nattereri 54.25637837 -1.002130504 
Myotis nattereri 54.25637837 -1.002130504 

Я пытаюсь напечатать одну строку набора данных, чтобы проверить, если он правильно splittiing, но ничего не отображается в оболочке

Update:

Это код, с которым я сейчас работаю;

def LineToList(FileName): 
    FileIn = open(FileName, "r") 
    DataList = [] 
    for Line in FileIn: 
     Line = Line.rstrip() 
     DataList.append(Line) 
     EntryList = [] 
     for Entry in Line: 
      Entry = Line.split("\t") 
      EntryList.append(Entry) 
      return EntryList 
    FileIn.close() 
    return DataList 

def CalculateDistance(Lat1, Lon1, Lat2, Lon2): 

    Lat1 = float(Lat1) 
    Lon1 = float(Lon1) 
    Lat2 = float(Lat2) 
    Lon2 = float(Lon2) 

    nDLat = (Lat1 - Lat2) * 0.017453293 
    nDLon = (Lon1 - Lon2) * 0.017453293 

    Lat1 = Lat1 * 0.017453293 
    Lat2 = Lat2 * 0.017453293 

    nA = (math.sin(nDLat/2) ** 2) + math.cos(Lat1) * math.cos(Lat2) * (math.sin(nDLon/2) ** 2) 
    nC = 2 * math.atan2(math.sqrt(nA),math.sqrt(1 - nA)) 
    nD = 6372.797 * nC 

    return nD 

DataList = LineToList("Mammal.txt")     
for Line in DataList: 
    LocationCount = 0 
    CalculateDistance(Entry[1], Entry[2], 54.988056, -1.619444) 
    if CalculateDistance <= 10: 
     LocationCount += 1 
    print("Number Recordings within Location Range:", LocationCount) 

При запуске программы приходят с ошибкой:

CalculateDistance(Entry[1], Entry[2], 54.988056, -1.619444) NameError: name 'Entry' is not defined 
+3

Вы можете уточнить * "не работает" *? Можете ли вы также дать фрагмент файла, чтобы мы могли экспериментировать с ним? Просто глядя на ваш код, я подозреваю, что проблема может заключаться в том, что вы добавляете 'Line' в' DataList' вместо 'EntryList'. – Reti43

+2

'для входа в line.split (" \ t "): entrylist.append (запись)' Не используйте CamelCase для имен переменных. Используйте строчные буквы. – zondo

+0

@zondo PEP8 на самом деле рекомендует нижний регистр нижнего регистра с нижним регистром для имен переменных и функций. - не то, что это влияет на работу кода в любом случае, но если вы собираетесь исправить OP, вы можете следовать соглашению.Тем не менее, я использую mixedCase для своих переменных, чтобы сделать мой код более читаемым для меня (mixedCase не рекомендуется ни для чего в PEP8, и для меня имеет смысл иметь разные стили именования для функций и переменных). – Tom

ответ

1

Ваш DataList переменная является локальной по отношению к функции LineToList; Вы должны присвоить другой переменной в области видимости файла:

DataList = LineToList("Mammal.txt") 
print(DataList[1]) 
+0

Спасибо! Теперь это печать в оболочке! – NKing

+0

@NicoleKing: Если вы отметите мой ответ как принятый, это покажет другим, что у вас есть решение. –

1

Я думаю, что у вас есть регулярные табуляции CSV, что csv.reader можно легко разобрать для вас.

import csv 
DataList = [row for row in csv.reader(open('Mammal.txt'), dialect='excel-tab')] 
for data in DataList: 
    print(data) 

Это приводит к

['Myotis nattereri', '54.07663633', '-1.006446707'] 
['Myotis nattereri', '54.25637837', '-1.002130504'] 
['Myotis nattereri', '54.25637837', '-1.002130504'] 
2

Я видел «Биологические науки» в вашем профиле и только из-за того, что я бы порекомендовал вам внимательно посмотреть на Pandas модуля.

Это может быть очень легко:

import pandas as pd 

df = pd.read_csv('mammal.txt', sep='\t', 
       names=['species','lattitude','longitude'], 
       header=None) 

print(df) 

Выход:

  species lattitude longitude 
0 Myotis nattereri 54.076636 -1.006447 
1 Myotis nattereri 54.256378 -1.002131 
2 Myotis nattereri 54.256378 -1.002131 
Смежные вопросы