Разбор 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