Как мне выбрать случайную ячейку в csv

#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. Это по-прежнему выбирает случайные буквы из строки имени файла, а не из файла, который он называет.