#python #csv #random
#python #csv #Случайный
Вопрос:
У меня есть файл CSV, содержащий только случайные слова. Нет заголовка.
Например:
"dawn","go","test","these","swung"
"joy","frequently","seven","congress"
Мой код не выбирает случайную ячейку и возвращает ошибку:
TypeError: '_csv.reader' object is not subscriptable
Мой код:
def random_select(self):
csv_reader = csv.reader("randomwords.csv")
words = list(csv_reader)
random_names = random.choice(words)
readcsv = csv_reader[random_names][random_names]
print(''.join(readcsv))
Комментарии:
1. Не очень знаком с использованием модуля csv, кроме
with open()...
синтаксиса. Не могли бы вы импортироватьrandom
модуль, подсчитать количество строк в вашем csv-файле, сгенерировать случайное целое число, а затем выбрать строку в этой позиции?2. Что, как вы надеетесь
csv_reader[random_names][random_names]
, следует делать? Мне трудно сказать что-то большее, чем то, что уже есть в сообщении об ошибке, но, вероятно, ваше воображение богаче моего, чтобы вы придумали этот код в первую очередь.3.
csv.reader("randomwords.csv")
создает средство чтения, которое возвращает[['r'], ['a'], ['n'], ['d'], ['o'], ['m'], ['w'], ['o'], ['r'], ['d'], ['s'], ['.'], ['c'], ['s'], ['v']]
. Если вы хотите прочитать из файла, вам нужноopen
это, а затем передать дескриптор файлаcsv.reader
.
Ответ №1:
Вот рефакторинг с исправленными немедленными ошибками.
# There is no class here and no self here -- don't use self as argument
def random_select():
# Open a file handle, pass it to the CSV reader instance
with open("randomwords.csv") as r:
# Read all words from all lines into a single list
words = [word for line in csv.reader(r) for word in line]
# Pick out two random words
return ''.join([random.choice(words), random.choice(words)])
Внутренние функции обычно должны выдавать только return
результат; вызывающий может затем print
получить результат, если захочет.
При коротком списке ввода существует нетривиальная вероятность того, что одно и то же слово будет выбрано случайным образом дважды. Из вашего вопроса даже не ясно, действительно ли вам нужны два случайных слова из списка, но это мое лучшее предположение относительно того, что должен выдавать код. Если вы хотите что-то еще, надеюсь, теперь должно быть очевидно, что нужно изменить.
Повторное чтение файла CSV в память каждый раз, когда вы вызываете эту функцию, ужасно неэффективно; вероятно, реорганизуйте код, чтобы один раз прочитать список в памяти, а затем выберите случайные слова из списка слов, когда вам понадобится больше.
Файл CSV, вероятно, совсем не идеален для такого варианта использования. Стандартный способ хранения списка слов, по крайней мере, с конца 1960-х годов, — это простой текстовый файл, по одному слову или фразе в строке.
Комментарии:
1. отлично, спасибо, это сделало именно то, что мне было нужно, с меньшим количеством кода.
2. Спасибо, я был сосредоточен на части случайного выбора и просто пытался написать какое-то руководство, чтобы указать ему правильное направление, прежде чем начать свой рабочий день.
Ответ №2:
код, который работал:
def Generate(self):
rcolumn = random.randint(0, 10)
rrow = random.randint(0, 66)
with open('randomwords.csv', 'r') as f:
mycsv = csv.reader(f)
mycsv = list(mycsv)
print(mycsv[rrow][rcolumn])
Комментарии:
1. Вы жестко задаете предположения о количестве записей в текстовом файле. Вероятно, лучше прочитать все это в память, а затем использовать размеры данных, которые у вас есть в памяти, чтобы определить ограничения.
Ответ №3:
random_names
выбрана ли из одной строки words
. So words
доступен для подписки, но ничего больше.
Если вы просто ищете «random_itemrandom_item», который будет сгенерирован в виде строки,
def random_select(self):
csv_reader = csv.reader("randomwords.csv")
lines = list(csv_reader)
words = lines[0]
print(''.join(random.choices(words, k=2)))
Комментарии:
1. Я никогда не использовал функцию random много. Спасибо за хорошее описание на pynative.com/python-random-choice за то, что проинформировал меня о random.choices() вместо random.choice()
2. спасибо за ввод. копируя ваш код, я получил ошибку ‘TypeError: элемент последовательности 0: ожидаемый экземпляр str, список найден’.
3. Аргументом to
csv.reader
должен быть дескриптор файла, и итерация по нему возвращает список списков слов (каждая строка представляет собой один список строк). Наличие однострочного CSV-файла в любом случае немного безумно. Вероятно, лучшим вариантом было бы иметь по одному слову в строке в обычном текстовом файле.4. да,
words=list(csv_reader)
генерирует список элементов для каждой строки файла csv (список списков). Отредактировано, чтобы вы оказались там, где вы ищете.5. Это по-прежнему выбирает случайные буквы из строки имени файла, а не из файла, который он называет.