Python Minimum пуст
f = open("data.txt", "r")
lines = f.read().split('\n')
a= max(lines)
print a
f.close()
Приведенный выше код получает максимум из моего файла данных, но когда я пытаюсь:
f = open("data.txt", "r")
lines = f.read().split('\n')
a= min(lines)
print a
f.close()
Я получаю пустое возвращение, как минимум в файле пустое место. Почему это? Как я могу получить минимальное чтение?
Файл выглядит так
1
2
3
4
5
4 ответа
Это потому, что у вас есть пустая строка в вашем файле. Чтобы отбросить эти значения, используйте выражение генератора или понимание списка
f = open("data.txt", "r")
lines = f.readlines()
if lines:
a = min(int(line) for line in lines if line.strip())
print a
f.close()
Ошибка, как указано выше, из-за \n
... Вы можете попробовать это
with open("file.txt") as f:
print(min(int(i) for i in f if i.strip()))
Это генератор exp в сочетании с функцией cal ... Хотя и сложнее, он меньше по размеру
Я предлагаю вам изменить свой код, как показано ниже.
f = open("file", "r")
print(min((i for i in f.read().split('\n') if i), key=float))
f.close()
Исполнение:
$ cat file
0.5
1
2
3
4
5
10.1
10.2
$ python3 file.py
0.5
Первое предположение может заключаться в том, что ваш файл на самом деле имеет пустую / пустую строку в конце, что приведет к тому, что "минимум" будет пустым.
Однако, даже с файлом без постороннего символа новой строки, у вас все равно будет проблема.
Если вы разделите поток AA\nBB\nCC\n
(обычный файл) с символом новой строки в качестве разделителя, последний символ новой строки даст вам пустой элемент, так же, как разделение AA,BB,CC,
на запятой бы:
['AA','BB','CC','']
Другими словами, после последнего разделителя есть пустое поле.
Есть несколько способов исправить это, например:
lines = f.read().split('\n')[:-1]
или, альтернативно:
a = min(lines[:-1])
если вы знаете, что будет заключительный символ новой строки (который обычно должен быть для обычных текстовых файлов).
Если вы хотите обработать случаи, когда файл может не обязательно заканчиваться переводом строки и также может быть пустым, вы можете использовать это вместо:
lines = f.read().split('\n')
if len(lines) == 0:
minline = "" # or None if you prefer
else:
if lines[-1] == '':
lines = lines[:-1]
minline = min(lines)
# Use minline here
И, как последнее замечание, min/max
дать вам лексикографическую сортировку, которая будет сортировать числа от 1 до 10 включительно как:
1,10.2.3.4.5.6.7.8.9
Если вам нужна числовая сортировка (и вы знаете, что все строки имеют допустимые числа), используйте:
min(mylist,key=int)