2012-07-04 2 views
0

это следующий образец данныхИмпорт .txt данных в определенном формате

"TABITHA","OLLIE","JAIME","WINIFRED" 

с последующим куском кода, который правильно считывает его.

with open("names.txt", 'rb') as f: 
    data = [map(str, line.split(',')) for line in f] 

Однако, это читает его в как список списков. Список состоит только из одного списка «высокий»,

e.g. [["TABITHA", "OLLIE", "JAIME", "WINIFRED"]] 

и поэтому может быть просто списком, а не списком списков. Есть ли способ прочитать его как просто список? Путь обучения продолжает: -)

ответ

3

Используйте «включенные батареи» csv (значения, разделенные запятой) m МОДУЛЬ. Несмотря на название, он также может быть настроен для других разделителей и также имеет ряд других параметров.

import csv 
with open('names.txt','rb') as f: 
    for line in csv.reader(f): 
     print line 

Выход:

['TABITHA', 'OLLIE', 'JAIME', 'WINIFRED'] 
+0

Итак, вы получили работу csv, которая лучше меня: p. Но как мне на самом деле это стать списком, который я могу использовать в своем модуле? Прямо сейчас вы просто распечатываете его. – nebffa

+0

'line' - это список. Просто используйте его. если вам нужны все строки в файле, используйте 'list (csv.reader (f))' вместо цикла 'for', но вы снова получите список списков, даже если у вас есть только одна строка. С помощью цикла 'for' вы обрабатываете одну строку за раз, и у вас есть только одна строка. –

+0

Вау, я попробовал это раньше, но не понял, что у этого есть такая функциональность. Таким образом, это просто «с» и «для» фактически импортирует строку в виде всего списка. Я не понимал этого, потому что не было очевидного кода, чтобы предположить это. Мой последний вопрос тогда - скажем, я не хочу печатать строку «, я просто хочу ее прочитать, какой наполнитель я должен использовать с Python. Спасибо! – nebffa

0

Редактировать

Функциональный, "ролл своего собственного", код:

with open("names.txt", 'rb') as f: 
    for line in f: 
     line = line.strip() 
     line = [w.replace('"','') for w in line.split(',')] 
     print line 

создает списокline:

['TABITHA', 'OLLIE', 'JAIME', 'WINIFRED'] 
+0

@downvoter .. этот код является функциональным и соответствует техническим требованиям OP в. – Levon

+0

с открытым ("names.txt", 'rb') как f: для строки в f: строка = [w.replace ('"', '') для w в строке.split (',')] также работает - нет необходимости в снятии. Thankyou – nebffa

+0

Не downvoter, но если данные имеют запятые между кавычками, это не работает, поэтому лучше использовать тестируемый модуль, например csv, вместо roll-your –

0

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

0

Если вы хотите быть глупым и не использовать модуль CSV:

sum([line.split(", ") for line in f], []) 

Edit: Что случилось с моими исходными данными тогда?

>>> f 
['TABITHA, OLLIE, JAIME, WINIFRED', 'Spam, Eggs, Dead Parrots'] 
>>> sum([line.split(", ") for line in f], []) 
['TABITHA', 'OLLIE', 'JAIME', 'WINIFRED', 'Spam', 'Eggs', 'Dead Parrots'] 

С файлом:

$ cat temp.csv 
foo, bar, baz 
spam, eggs, quux 
$ python 
>>> f = open("temp.csv") 
>>> sum([line.split(", ") for line in f], []) 
['foo', 'bar', 'baz\n', 'spam', 'eggs', 'quux\n'] 

(Добавить в map(str.strip, ...) избавиться от задних пробелов)

+0

дает '['' TABITHA", "OLLIE", "JAIME", "WINIFRED" \ n '] 'когда я его запускаю. – Levon

+0

Да, это читает в общей сложности ~ 45000 предметов из моих данных, в то время как должно быть только ~ 5000 предметов. – nebffa

+0

См. Править, пожалуйста. – tsm

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