найдите наибольшее число в текстовом файле и запишите его строку

#python

#python

Вопрос:

У меня есть текстовый файл, который выглядит следующим образом: (первая строка — это информация о столбцах, и у меня более 150 строк)

 E1,   E2,  E3,  E4,  E5,    E6,       E7,     E8
abc, cba, dfa, gds, 60371, 42.1234, -2.12,    hkfka
grs, fx,  hgf, eff, 30331, 124,     31313.23,  gj
.
.
.
  

Ожидаемый результат:

 abc, cba, dfa, gds, 60371, 42.1234, -2.12, hkfka
  

Я читаю этот файл с with open помощью метода, затем я хочу найти наибольшее число в столбце E5. В этом примере это ‘60371’. После того, как я нашел его, я хотел бы записать всю его строку в текстовый файл. Я могу найти наибольшее число, добавив строку в список, но не могу записать ее строку с помощью этого метода.

     list = []
    with open(file.csv, "r") as m:
        text = m.readlines()[1:]
        text = [line.replace(' ', '') for line in text]
        for line in text:
            currentline = line.split(",")
            number= currentline[4]
            list.append(number)
            largest = max(list)
  

Редактировать: мне не разрешено использовать какие-либо импортные файлы, такие как panda и т. Д.

Комментарии:

1. Подсказка: следите за наибольшим числом и строкой, в которой оно появляется

2. Прочитайте о enumerate ( book.pythontips.com/en/latest/enumerate.html )

3. Если у вас больше строк и столбцов (и формат вашего файла четко определен), вы можете использовать pandas для этого. Это позволит вам найти максимальное значение по столбцу без перебора всех строк.

4. еще один совет, хотя и не отвечающий на ваш вопрос: вы можете использовать модуль csv python, и вы можете ссылаться на столбцы, используя символические имена вместо позиционных индексов

5. Мне не разрешено использовать какой-либо импорт

Ответ №1:

1. Без библиотек

 with open('data.csv', 'r') as f:
    next(f)
    lines = [line.replace(' ', '').split(',') for line in f.readlines()]
    numbers = [int(line[4]) for line in lines]
    index = numbers.index(max(numbers))

with open('result.csv', 'w') as f:
    f.write(f'{index} ({lines[index][1]})')
  

Вывод:

 0 (cba)
  

2. С помощью pandas

 import pandas as pd

df = pd.read_csv('data.csv')
row = df[df['  E5'] == df['  E5'].max()]
row.to_csv('result.csv')
  

Выходной файл:

 ,E1,   E2,  E3,  E4,  E5,    E6,       E7,     E8
0,abc, cba, dfa, gds,60371,42.1234,-2.12,    hkfka
  

Комментарии:

1. Извините, забыл упомянуть, что мне не разрешено использовать какой-либо импорт.

2. Спасибо, это самое понятное и простое решение, которое отлично работает.

3. У меня был бы последний вопрос, если мне позволено. Как я могу записать только части E1 и E3 из правой строки, а не всю строку? Итак, ожидаемый результат будет 0 (cba)

Ответ №2:

Вы можете сохранить строку в цикле.

 list = []
cur_n = 0
max_n = 0
max_line = 0
i = 0
with open("file.csv", "r") as m:
    text = m.readlines()[1:]
    text = [line.replace(' ', '') for line in text]
    for i in range(0, len(text)):
        currentline = text[i].split(",")
        cur_n = int(currentline[4])
        if cur_n > max_n :
            max_n = cur_n
            max_line = i
print(max_n)
print(text[max_line])
  

Ответ №3:

Вы также можете сохранить текст строки, содержащей наибольшее число, как объект, аналогично тому, как вы храните сами числа. Если вам не нужно извлекать все строки и все числа, я бы сохранил только последнее наибольшее число и соответствующий ему текст строки. Например:

 max_number = 0
max_line = ''
with open(file.csv, "r") as m:
    text = m.readlines()[1:]
    text = [line.replace(' ', '') for line in text]
    for line in text:
        currentline = line.split(",")
        number = int(currentline[4])
        if number > max_number: 
             max_number = number 
             max_line = line
  

Таким образом max_number , будет наибольшее число, найденное в этих циклах, и max_line будет его соответствующей строкой, но никакие другие данные из файла не будут сохранены.

Комментарии:

1. Я не могу использовать ‘>’ между экземплярами ‘str’ и ‘None’

2. вы правы, я внес правку. Вы можете инициализировать значение max_number 0 (если вы знаете, что числа всегда будут равны или больше 0) или что-то очень маленькое, например 1e-30 , в противном случае.

3. он выдает ту же проблему, но с ‘str’ и ‘int’

4. Хорошо, похоже, вам может потребоваться преобразовать число в целое число или тип с плавающей запятой (например number = int(currentline[4]) ), поскольку в данный момент оно считывается как строка.

5. Инициализируйте max_number -float('inf') , поскольку оно всегда меньше любого значения, и выполните float(currentline[4])

Ответ №4:

Вот простая версия, использующая преимущества встроенного модуля CSV. Это в основном полезно, если формат CSV изменяется при вставке, перемещении, удалении полей и т. Д. Поэтому мы всегда используем идентификатор столбца «E5»:

 import csv

with open("test.txt", "r") as csvfile:
    reader = csv.DictReader(csvfile, skipinitialspace=True)
    cur_max = -float("inf")

    for row in reader:
        val = float(row["E5"])
        if val > cur_max:
            cur_max = val
            max_line = ", ".join(row.values())

print(max_line)  # abc, cba, dfa, gds, 60371, 42.1234, -2.12, hkfka
  

Это также один проход, который может быть вообще не нужен.

Сначала я понял, что под любым импортом вы подразумевали внешний импорт, но любой импорт запрещен, тогда можно использовать другие ответы. Обратите внимание, что вы хотите привести значения с float помощью though , поскольку входной файл, похоже, содержит их и int , естественно, отбрасывает любые значения с плавающей запятой. Если E5 всегда int , то, конечно int , все в порядке