2014-01-22 4 views
2

Я попытался открыть .txt-файл в виде массива в python, поэтому я могу работать с элементами внутри. Файл .txt (abc.txt) выглядит примерно так.Открытие текстового файла как массив в python

AL192012,    TONY,  20, 
20121021, 1800, , LO, 20.1N, 50.8W, 25, 1011, 
20121022, 0000, , LO, 20.4N, 51.2W, 25, 1011, 
20121022, 0600, , LO, 20.8N, 51.5W, 25, 1010, 
20121022, 1200, , LO, 21.3N, 51.7W, 30, 1009, 
AL182012,    SANDY,  45, 
20121021, 1800, , LO, 14.3N, 77.4W, 25, 1006, 
20121022, 0000, , LO, 13.9N, 77.8W, 25, 1005, 
20121022, 0600, , LO, 13.5N, 78.2W, 25, 1003, 
20121022, 1200, , TD, 13.1N, 78.6W, 30, 1002, 

Я попытался pd.read_csv('abc.txt'), loadtxt("abc.txt") и genfromtxt("abc.txt"). Но они генерировали только массив с тремя столбцами, вероятно, потому, что первая строка имела только три столбца. Но я хочу, чтобы у него были те же восемь столбцов, что и файл .txt. Это возможно? Благодаря!

+0

Ну, что вы ожидаете эти две строк, которые не имеют, как много столбцов, чтобы появиться в в результате? – poke

+0

Спасибо. Если этот массив называется b, я хочу получить SANDY с помощью b [5,4] и получить TD с помощью b [9,3]. – Ron

ответ

1
>>> with open(filename) as f: 
     data = [[cell.strip() for cell in row.rstrip(',').split(',')] for row in f] 

>>> for row in data: 
     print(row) 

['AL192012', 'TONY', '20'] 
['20121021', '1800', '', 'LO', '20.1N', '50.8W', '25', '1011'] 
['20121022', '0000', '', 'LO', '20.4N', '51.2W', '25', '1011'] 
['20121022', '0600', '', 'LO', '20.8N', '51.5W', '25', '1010'] 
['20121022', '1200', '', 'LO', '21.3N', '51.7W', '30', '1009'] 
['AL182012', 'SANDY', '45'] 
['20121021', '1800', '', 'LO', '14.3N', '77.4W', '25', '1006'] 
['20121022', '0000', '', 'LO', '13.9N', '77.8W', '25', '1005'] 
['20121022', '0600', '', 'LO', '13.5N', '78.2W', '25', '1003'] 
['20121022', '1200', '', 'TD', '13.1N', '78.6W', '30', '1002'] 

Если вы хотите, чтобы исправить индексы для коротких линий, вы могли бы сделать это явно впоследствии:

>>> data = [row if len(row) == 8 else row[0:1] + [''] * 3 + row[1:3] + [''] * 2 for row in data] 
>>> for row in data: 
     print(row) 

['AL192012', '', '', '', 'TONY', '20', '', ''] 
['20121021', '1800', '', 'LO', '20.1N', '50.8W', '25', '1011'] 
['20121022', '0000', '', 'LO', '20.4N', '51.2W', '25', '1011'] 
['20121022', '0600', '', 'LO', '20.8N', '51.5W', '25', '1010'] 
['20121022', '1200', '', 'LO', '21.3N', '51.7W', '30', '1009'] 
['AL182012', '', '', '', 'SANDY', '45', '', ''] 
['20121021', '1800', '', 'LO', '14.3N', '77.4W', '25', '1006'] 
['20121022', '0000', '', 'LO', '13.9N', '77.8W', '25', '1005'] 
['20121022', '0600', '', 'LO', '13.5N', '78.2W', '25', '1003'] 
['20121022', '1200', '', 'TD', '13.1N', '78.6W', '30', '1002'] 
+0

Спасибо. Но могу ли я спросить, дает ли это массив? Похоже, данные [0] дают первую строку и данные [1] дают вторую строку и т. Д., Причем тип (данные) является списком каждого. Есть ли массив, в котором элемент [5,4] дает SANDY? Или я не получу вашу идею. – Ron

+0

'data' будет списком списков; поэтому 'data [5] [4]' даст 'SANDY' и т. д. В Python нет массивов, а синтаксис' [5,4] 'предполагает, что вы пытаетесь использовать массивы из NumPy или что-то еще. Я думаю, вы можете каким-то образом преобразовать списки в массивы, но я не знаю, как это работает, но вам все равно необязательно делать это. Использование списков в порядке. – poke

+0

Спасибо. Теперь я понимаю. – Ron

0

Здесь сниппета:

#!/usr/bin/python 

import sys 

with open(sys.argv[1], 'r') as f: 
    content = f.readlines() 

for w in content: 
    print w 

    # split and loop again -> w.split(',') 

f.readlines() возвращает массив
w является массивом.

+0

Спасибо. Но что мне делать с вашей последней строкой? Поскольку, когда я включил только пять строк из импорта до печати w, тип (содержимое) - это список, а w - только контент [66], который является строкой. Могу ли я спросить, что вы имеете в виду под разделом и циклом снова ... – Ron

2

попробовать что-то вроде этого:

data = [] 
with open("filename") as f: 
    for line in f: 
    data.append(line.split(",")) 

и что даст вы 2D-массив данных, на которых вы можете работать.

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

так что вы затем перенести его любит:

data = list(itertools.izip_longest(*data)) 
+0

Спасибо. Но мне может понадобиться немного больше помощи, если это возможно. Я получил список, называемый данными. Есть ли способ получить 10-на-8 2Darray я хочу, где, например, элемент в [0,0] дает мне AL192012, [0,4] дает TONY, а [9,3] дает TD? – Ron

+0

@ user3223064 - это 2D-массив, вы получаете доступ к элементам типа array [0] [4] в python. Если вы хотите получить к нему доступ таким образом, вы захотите использовать 'numpy', и если вы собираетесь это сделать, вы также можете пройти полное расстояние и просто использовать [' numpy.loadtxt() '] (http://stackoverflow.com/a/4315914/432913) – will

+0

Спасибо. Твои работы. Но с другой стороны numpy.loadtxt() по-прежнему дает мне только три столбца вместо восьми. так или иначе.. – Ron

Смежные вопросы