Извлечение столбцов из текстового файла с учетом некоторых критериев - 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))