Извлечение столбцов из текстового файла с учетом некоторых критериев - Python

У меня есть файл с разделителями табуляции как таковой:

0923    ar blah black sheep 5555    hahahaa
234.231 world
111.11 whatever whatever    123123
whatsoever
03241

Мне нужно сделать это в структуру словаря, где

  • 2-й столбец является ключом
  • значение является кортежем 1-го и 3-го столбца
  • ничего с 1 столбцом не было бы в словаре
  • все, что находится за пределами первых 3-х столбцов, игнорируется

Желаемый результат:

{'ar blah black sheep': ('0923', '5555'), 'whatever whatever': ('111.11', '123123')}

Я делал так:

text = """0923  ar blah black sheep 5555    hahahaa
234.231 world
111.11  whatever whatever   123123
whatsoever  
03241"""

result = {}

for i in text.split('\n'):
    columns = i.strip().split('\t')
    if 1 < len(columns) and len(columns) > 2:
        result[columns[1]] = (columns[0], columns[2])

print result

Есть ли другой способ сделать это? Имейте в виду, что количество строк в текстовом файле превышает 2 миллиона строк.

2 ответа

Решение

Модуль Python CSV является лучшим методом.

импорт CSV, SYS

 with open("somefile.txt", 'r') as in_file:
      dialect = csv.Sniffer().sniff(in_file.read(1024)) # detect tab delimiter
      in_file.seek(0) 
      next(reader, none) # skip header
      reader = csv.reader(in_file, dialect) # load file with the determined delimiter

Читатель будет в формате словаря. Ты можешь использовать

 out_file = open("somefile2.txt", 'w')
 writer = csv.writer(out_file)
 for row in reader:
      writer.writerow(row)
 out_file.close()

Для больших файлов вы можете использовать for line in file это обрабатывает загрузку для вас и не помещает весь файл в память.

Но для определенных типов файлов, таких как tsv, вы можете использовать встроенный модуль csv. Вам просто нужно сообщить модулю csv, как делятся ваши данные.

import csv

with open("foo.tsv", "r") as f:
    reader= csv.reader(f, delimiter='\t')   # tell csv to parse a tsv
    for row in reader:
        if len(row) >= 3:   # if we got atleast 3 arguments
            key, value = row[1], (row[0],row[2])    # set the 2nd as key the 1st and 3rd as value
            print('Key:"'+key+'" Value:'+str(value))
Другие вопросы по тегам