Разбор CSV/табуляции с txt файлом с Python
В настоящее время у меня есть файл CSV, который при открытии в Excel имеет в общей сложности 5 столбцов. Только столбцы A и C имеют для меня какое-либо значение, а данные в остальных столбцах несущественны.
Начиная с строки 8 и затем работая в кратных 7 (т.е. строках 8, 15, 22, 29, 36 и т.д.), я ищу для создания словаря с Python 2.7 с информацией из этих полей. Данные в столбце A будут ключом (6-значное целое число), а данные в столбце C являются соответствующим значением для ключа. Я попытался выделить это ниже, но форматирование не лучшее: -
A B C D
1 CDCDCDCD
2 VDDBDDB
3
4
5
6
7 DDEFEEF FEFEFEFE
8 123456 JONES
9
10
11
12
13
14
15 293849 SMITH
В соответствии с вышеизложенным, я хочу извлечь значение из A7 (DDEFEEF) в качестве ключа в моем словаре, а "FEFEFEFEF" - соответствующие данные, а затем добавить еще одну запись в мой словарь, перейдя по строке 15 с помощью "2938495" мой ключ и "Смит" являются соответствующими значениями.
Любые предложения? Исходный файл - это .txt файл с записями с разделителями табуляции.
Благодаря
Разъяснение:
Чтобы уточнить, до сих пор я пробовал следующее: -
import csv
mydict = {:}
f = open("myfile", 'rt')
reader = csv.reader(f)
for row in reader:
print row
Вышеприведенное просто распечатывает весь контент, хотя строка за раз. Я попробовал "для строки (7) в читателе", но это вернуло ошибку. Затем я исследовал его и пошел дальше, но он тоже не работал:
import csv
from itertools import islice
entries = csv.reader(open("myfile", 'rb'))
mydict = {'key' : 'value'}
for i in xrange(6):
mydict['i(0)] = 'I(2) # integers representing columns
range = islice(entries,6)
for entry in range:
mydict[entries(0) = entries(2)] # integers representing columns
Ответы
Ответ 1
Начните с включения текста в список списков. Это позаботится о парсинговой части:
lol = list(csv.reader(open('text.txt', 'rb'), delimiter='\t'))
Остальное можно сделать с помощью индексированных запросов:
d = dict()
key = lol[6][0] # cell A7
value = lol[6][3] # cell D7
d[key] = value # add the entry to the dictionary
...
Ответ 2
Хотя в других представленных решениях нет ничего плохого, вы могли бы упростить и значительно увеличить ваши решения, используя отличную библиотеку python pandas.
Pandas - это библиотека для обработки данных на Python, предпочитаемая многими учеными-учеными.
Pandas имеет упрощенный интерфейс CSV для чтения и анализа файлов, которые могут использоваться для возврата списка словарей, каждый из которых содержит одну строку файла. Ключами будут имена столбцов, а значения будут в каждой ячейке.
В вашем случае:
import pandas
def create_dictionary(filename):
my_data = pandas.DataFrame.from_csv(filename, sep='\t', index_col=False)
# Here you can delete the dataframe collumns you dont want!
del my_data['B']
del my_data['D']
# ...
# Now you transform the DataFrame to a list of dictionaries
list_of_dicts = [item for item in my_data.T.to_dict().values()]
return list_of_dicts
# Usage:
x = create_dictionary("myfile.csv")
Ответ 3
Если файл большой, вы можете не захотеть полностью загрузить его в память. Такой подход позволяет избежать этого. (Разумеется, из-за того, что из него вышло бы извещение, он мог бы взять некоторую оперативную память, но он был бы меньше, чем исходный файл.)
my_dict = {}
for i, line in enumerate(file):
if (i - 8) % 7:
continue
k, v = line.split("\t")[:3:2]
my_dict[k] = v
Изменить: не знаю, где я получил extend
от ранее. Я имел в виду update