#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
, все в порядке