TypeError: объект типа '_io.TextIOWrapper' не имеет len () [duplicate]

Буквально самый простой способ исправить NullReferenceExeption имеет два пути. Если у вас есть GameObject, например, с прикрепленным скриптом и переменной с именем rb (rigidbody), эта переменная начнет пустую, когда вы начнете игру. Вот почему вы получаете NullReferenceExeption, потому что на компьютере нет данных, хранящихся в этой переменной.

В качестве примера я буду использовать переменную RigidBody. Мы можем добавить данные действительно легко на самом деле несколькими способами:

  1. Добавить RigidBody к вашему объекту с помощью AddComponent> Физика> Rigidbody Затем зайдите в свой скрипт и введите rb = GetComponent<Rigidbody>();. Эта строка кода работает лучше всего под ваши функции Start() или Awake().
  2. Вы можете добавить компонент программно и назначить переменную одновременно с одной строкой кода: rb = AddComponent<RigidBody>();

Дальнейшие заметки: если вы хотите, чтобы единство добавлялось компонент для вашего объекта, и вы, возможно, забыли добавить его, вы можете ввести [RequireComponent(typeof(RigidBody))] над объявлением класса (пробел ниже всех ваших приложений). Наслаждайтесь и получайте удовольствие от игр!

28
задан Shane 22 August 2010 в 06:23
поделиться

9 ответов

Не встроен, но алгоритм R(3.4.2) («Резервуарный алгоритм Уотермана») из «Искусство компьютерного программирования» Кнута хорош (в очень упрощенной версии):

import random

def random_line(afile):
    line = next(afile)
    for num, aline in enumerate(afile):
      if random.randrange(num + 2): continue
      line = aline
    return line

num + 2 создает последовательность 2, 3, 4 ... Таким образом, randrange будет 0 с вероятностью 1.0/(num + 2) - и это вероятность, с которой мы должны заменить выбранную в данный момент линию (особый случай размер выборки 1 ссылочного алгоритма - см. книгу Кнута для доказательства корректности ==, и, конечно же, мы также имеем дело с достаточно маленьким «резервуаром» для размещения в памяти; -) ... и точно вероятность с которым мы делаем так.

53
ответ дан Alex Martelli 27 August 2018 в 05:52
поделиться

Это зависит от того, что вы подразумеваете под «слишком большими» накладными расходами. Если сохранить весь файл в памяти, возможно, что-то вроде

import random

random_lines = random.choice(open("file").readlines())

выполнит трюк.

8
ответ дан cji 27 August 2018 в 05:52
поделиться

Вы можете добавить строки в набор (), который будет произвольно изменять их порядок.

filename=open("lines.txt",'r')
f=set(filename.readlines())
filename.close()

Чтобы найти 1-ю строку:

print(next(iter(f)))

Чтобы найти 3-й line:

print(list(f)[2])

Чтобы перечислить все строки в наборе:

for line in f:
    print(line)
0
ответ дан GoTrained 27 August 2018 в 05:52
поделиться
import random

with open("file.txt", "r") as f:
    lines = f.readlines()
    print (random.choice(lines))
0
ответ дан HCLivess 27 August 2018 в 05:52
поделиться

Если вы не хотите читать весь файл, вы можете искать его в середине файла, затем искать назад для новой строки и вызывать readline.

Вот Python3 скрипт, который делает именно это,

. Одним из недостатков этого метода является то, что короткие линии имеют более низкое вероятность появления.

def read_random_line(f, chunk_size=16):
    import os
    import random
    with open(f, 'rb') as f_handle:
        f_handle.seek(0, os.SEEK_END)
        size = f_handle.tell()
        i = random.randint(0, size)
        while True:
            i -= chunk_size
            if i < 0:
                chunk_size += i
                i = 0
            f_handle.seek(i, os.SEEK_SET)
            chunk = f_handle.read(chunk_size)
            i_newline = chunk.rfind(b'\n')
            if i_newline != -1:
                i += i_newline + 1
                break
            if i == 0:
                break
        f_handle.seek(i, os.SEEK_SET)
        return f_handle.readline()
2
ответ дан ideasman42 27 August 2018 в 05:52
поделиться

Ищите случайную позицию, читайте строку и отбрасывайте ее, затем читайте другую строку. Распределение линий не будет нормальным, но это не всегда имеет значение.

1
ответ дан Ignacio Vazquez-Abrams 27 August 2018 в 05:52
поделиться

Хотя я опаздываю на четыре года, я думаю, что у меня есть самое быстрое решение. Недавно я написал пакет python под названием linereader , который позволяет вам манипулировать указателями дескрипторов файлов.

Вот простое решение для получения случайной строки с этим пакетом:

from random import randint
from linereader import dopen

length = #lines in file
filename = #directory of file

file = dopen(filename)
random_line = file.getline(randint(1, length))

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

Если ваш файл очень маленький (достаточно маленький, чтобы вписаться в MB), вы можете заменить dopen с copen, и он делает кэшированную запись файла в памяти. Это происходит не только быстрее, но вы получаете количество строк в файле, поскольку оно загружается в память; это делается для вас. Все, что вам нужно сделать, это создать случайный номер строки. Вот пример кода для этого.

from random import randint
from linereader import copen

file = copen(filename)
lines = file.count('\n')
random_line = file.getline(randint(1, lines))

Я просто очень рад, потому что увидел кого-то, кто мог бы воспользоваться моим пакетом! Извините за мертвый ответ, но пакет определенно может быть применен ко многим другим проблемам.

7
ответ дан Nick Pandolfi 27 August 2018 в 05:52
поделиться

Это может быть громоздким, но это работает, я думаю? (по крайней мере, для txt-файлов)

import random
choicefile=open("yourfile.txt","r")
linelist=[]
for line in choicefile:
    linelist.append(line)
choice=random.choice(linelist)
print(choice)

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

linelist.remove(choice)

. Надеюсь, что это может помочь, но, по крайней мере, никаких дополнительных модулей и импорта (кроме случайных) и относительно легкого.

0
ответ дан Philip Hughes 27 August 2018 в 05:52
поделиться
import random
lines = open('file.txt').read().splitlines()
myline =random.choice(lines)
print(myline)

Для очень длинного файла: найдите случайное место в файле на основе его длины и найдите два символа новой строки после позиции (или новой строки и конца файла). Повторите 100 символов до или с начала файла, если исходная позиция поиска была & lt; 100, если мы оказались внутри последней строки.

Однако это сложнее, так как файл является итератором. возьмите random.choice (если вам нужно много, используйте random.sample):

import random
print(random.choice(list(open('file.txt'))))
24
ответ дан Tony Veijalainen 27 August 2018 в 05:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: