Найти номер строки или элемент в текстовом файле - PullRequest
1 голос
/ 30 октября 2019

Я хочу найти номер строки некоторого элемента в файле .txt.

Я создал пример файла .txt для показа здесь, и код, который я написал, работает только с первой строкой. Однако с реальным файлом он ничего не находит, а компилирует без проблем.


#create an example file
example=np.array([[1.0, 2.1e-06, 3.3], [5.0, 6.3, 7.8e-03]]) 

filename='/home/Desktop/example.txt'

np.savetxt(filename, example,  header ='exmpl')

#find the line number of a lookup value in the txt file

lookup = '2.1e-06'  


with open(filename) as fp:
    for num, line in enumerate(fp):
      if lookup in line:
            print(num)
            break

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Вы сравниваете две строки, и когда вы сохраняете массив np в текстовый файл, точность до e изменяется, поэтому даже если значение одной строки не совпадает.

Я придумала это решение. Я не мастер в Numpy и Python, но я знаю некоторые из этих трюков. Не стесняйтесь предлагать более элегантные или очевидные способы сделать это.

import numpy as np
#create an example file
example=np.array([[1.0, 2.1e-06, 3.3], [5.0, 6.3, 7.8e-03]]) 


filename='/home/Desktop/example.txt'

np.savetxt(filename, example,  header ='exmpl')

#find the line number of a lookup value in the txt file

lookup = 5.0e-00


with open(filename) as fp:
    for num, line in enumerate(fp):
        for i in line.split():
            #print(i)
            try:
                if float(i) == lookup:
                    print(num)
            except ValueError as e:
                pass
0 голосов
/ 30 октября 2019

Это потому, что numpy по умолчанию сохраняет значение с конечными десятичными знаками:

0 # example

1 1.000000000000000000e+00 2.099999999999999799e-06 3.299999999999999822e+00

2 5.000000000000000000e+00 6.299999999999999822e+00 7.799999999999999642e-03

Так что попробуйте явно посмотреть на это число:

lookup = 2.1e-06

with open(filename) as fh:
    # skip header
    _ = next(fh)

    for i, line in enumerate(fh, start=1):
        numbers = list(map(float, line.split()))
        if lookup in numbers:
            break

print(i)

Или, используя оператор filter:

lookup = 2.1e-06

with open(filename) as fh:
    # skip header
    _ = next(fh)

    for i, line in enumerate(fh, start=1):
        check = next(filter(lookup.__eq__, map(float, line.split())), None)

        # check will be None if the iterator is exhausted (no match)
        # otherwise, it will stop at the first True
        if check is not None:
            print(check)
            break
...