Текстовый файл разбирается максимально быстро - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть очень большой файл со строками, как показано ниже:

....

0.040027 abcde 12 34 56 78 90 12 34 56

0.050027 fghil 12 3456 78 90 12 34 56

0.060027 abcde 12 34 56 78 90 12 34 56

0.070027 fghil 12 34 56 78 90 12 34 56

0.080027 abcde 12 34 56 7890 12 34 56

0.090027 фгхил 12 34 56 78 90 12 34 56

....

Мне нужен словарь как можно быстрее.

Я использую следующий код:

ascFile = open('C:\\eample.txt', 'r', encoding='UTF-8')

tag1 = ' a b c d e '

tag2 = ' f g h i l '

tags = [tag1, tag2]

temp = {'k1':[], 'k2':[]}

key_tag = {'k1':tag1, 'k2':tag2 }

t1 = time.time()

for line in ascFile:

    for path, tag in key_tag.items():

        if tag in line:

            columns = line.strip().split(tag, 1)

            temp[path].append([columns[0], columns[-1].replace(' ', '')])

t2 = time.time()

print(t2-t1)

У меня есть следующий результат за 6 секунд анализа файла 360 МБ, я хотел бы улучшить время.

temp = {'k1': [['0,040027', '1234567890123456'], ['0,060027', '1234567890123456'], ['0,080027', '1234567890123456']], 'k2': [['0,050027', '1234567890123456 '], [' 0.070027 ',' 1234567890123456 '], [' 0.090027 ',' 1234567890123456 ']]}

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Я использовал раздел вместо разделения, чтобы тестирование и разделение выполнялись за один проход.

for line in ascFile:

    for path, tag in key_tag.items():

        val0, tag_found, val1 = line.partition(tag)

        if tag_found:
            temp[path].append([val0, val1.replace(' ', '')])
            break

Это лучше с вашим файлом размером 360 МБ?

Вы также можете выполнить простой тест, в котором все, что вы делаете, это циклически просматривайте файл по строке:

for line in ascFile:
    pass

Это скажет вам, какое будет ваше лучшее возможное время.

0 голосов
/ 08 февраля 2019

Я предполагаю, что у вас есть фиксированное количество слов в файле, которые являются вашими ключами.Используйте split, чтобы разорвать строку, а затем возьмите часть разделенного списка, чтобы непосредственно вычислить ваш ключ:

import collections

# raw strings don't need \\ for backslash:
FILESPEC = r'C:\example.txt'

lines_by_key = collections.defaultdict(list)

with open(FILESPEC, 'r', encoding='UTF-8') as f:
    for line in f:
        cols = line.split()
        key = ' '.join(cols[1:6])
        pair = (cols[0], ''.join(cols[6:]) # tuple, not list, could be changed
        lines_by_key[key].append(pair)

print(lines_by_key)
...