Уведомления

Группа в Telegram: @pythonsu

#1 Май 2, 2016 08:24:42

Apxumekmop
Зарегистрирован: 2016-03-30
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Ошибка randint - ValueError: empty range for randrange() (0,0, 0)

Проблема такая:
Есть скрипт, который должен 2 раза вытащить из файла 2 разные строки(рандомные).
Функция ConvertList - переводит текстовый файл в список.
Функция RandomString - достает рандомный индекс из списка.
Сам код:

import random
name_file = "test.txt"
def ConvertList(file_name):
	file = open(file_name, "r")
	convert_list = list(file)
	file.close
	return convert_list
def RandomString(l_name):
	len_list = len(l_name) - 1 
	rand_numb = random.randint(0, len_list)
	rand_str = l_name[rand_numb]
	return rand_str
string_list = ConvertList(name_file)
for x in range(0,2):
	string = RandomString(ConvertList(name_file))
	print(string)
	file = open(name_file, "w")
	string_list.remove(string)
	text_file = "".join(string_list)
	file.write(text_file)
	file.close

При выполнении кода выдает ошибку:

Traceback (most recent call last):
File “C:\Users\user\Desktop\test.py”, line 25, in <module>
string = RandomString(ConvertList(name_file))
File “C:\Users\user\Desktop\test.py”, line 16, in RandomString
rand_numb = random.randint(0, len_list)
File “C:\Python\lib\random.py”, line 218, in randint
return self.randrange(a, b+1)
File “C:\Python\lib\random.py”, line 196, in randrange
raise ValueError(“empty range for randrange() (%d,%d, %d)” % (istart, istop, width))
ValueError: empty range for randrange() (0,0, 0)

Судя по ошибке размер randint сводится к 0 и он не может взять число от 1,0. Но с файлами всё впорядке.
Задача скрипта выдать мне 2 раза рандомные значения, причем выданные значения должны удалятся из файла, что бы не было повторов.

Т.е в файле 10 строчек, функция должна взять рандом из этого числа и 1 раз она спокойно берет его, но вот на втором круге, когда файл уже отредактирован и так уже не 10 строчек, а 9 - выдает ошибку.
В чём может быть проблема?

Отредактировано Apxumekmop (Май 2, 2016 08:25:24)

Офлайн

#2 Май 2, 2016 08:51:09

Firik
Зарегистрирован: 2015-12-02
Сообщения: 151
Репутация: +  6  -
Профиль   Отправить e-mail  

Ошибка randint - ValueError: empty range for randrange() (0,0, 0)

Переименуйте file во что нибудь другое

Офлайн

#3 Май 2, 2016 09:06:06

Apxumekmop
Зарегистрирован: 2016-03-30
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Ошибка randint - ValueError: empty range for randrange() (0,0, 0)

Firik
Переименуйте file во что нибудь другое
Не помогло.

Офлайн

#4 Май 2, 2016 09:21:07

Apxumekmop
Зарегистрирован: 2016-03-30
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Ошибка randint - ValueError: empty range for randrange() (0,0, 0)

Сейчас порылся по поводу функций random, оказывается есть еще прелесть в виде random.choice().
Вытаскивает рандомную переменную из заданной последователности. Так вот, попробовал сделать через random.choice(), выдало схожую ошибку. Пишет, что не может взять последовательность из пустого списка.
Подправил немного блок, что бы посмотреть, что творится с переменной:

for x in range(0,2):
	new_string = ConvertList(name_file)
	print(new_string)
	string = RandomString(ConvertList(name_file))
	file = open(name_file, "w")
	string_list.remove(string)
	text_file = "".join(string_list)
	file.write(text_file)
	file.close

С 1 проходом всё нормально. Рандом значение вытаскивает, файл перезаписывает уже без него и на 2 проходе глохнет. Переменная new_string оказывается пустой. Лезу проверять файл - всё нормально, список на месте, ранее вытащенная рандомная строка удалена.
В общем проблема со списком, он пустой после перезаписывания файла. Как исправлять, господа программисты?)

Отредактировано Apxumekmop (Май 2, 2016 09:22:38)

Офлайн

#5 Май 2, 2016 09:36:46

Apxumekmop
Зарегистрирован: 2016-03-30
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Ошибка randint - ValueError: empty range for randrange() (0,0, 0)

Такс, как обычно, сам решил проблему.
Ошибка была в:

file.close

А именно, в отсутствии скобок - (). Т.е правильный вид:

file.close()

Я так до конца и не понял, почему возвращало пустой список, хотя догадки есть. Если кто может, поясните, хоть знать буду на будущее.

Офлайн

#6 Май 2, 2016 10:28:48

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Ошибка randint - ValueError: empty range for randrange() (0,0, 0)

Apxumekmop
def ConvertList(file_name): file = open(file_name, “r”) convert_list = list(file) file.close return convert_list
делайте так:
def ConvertList(file_name):
    with open(filename) as f:
        return f.readlines()



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version