Странная ошибка при чтении CSV-файла с помощью метода

#python-3.x

#python-3.x

Вопрос:

Итак, у меня есть CSV-файл (league.csv’) в моем каталоге, к которому я хочу получить доступ через Python.

Когда я делаю это:

 with open('league.csv', 'r') as csvFile:
  csvReader = csv.reader(csvFile)

  next(csvReader)

  for line in csvReader:
    print(line[0])
  

Он отлично работает. Но когда я пытаюсь превратить это в функцию, это не работает:

 def createLeague(csv):

  with open(csv, 'r') as csvFile:
      csvReader = csv.reader(csvFile)

      next(csvReader)

      for line in csvReader:
        print(line[0])
  return
  

Если я вызову это с помощью:

createLeague('league.csv')

Я получаю сообщение об ошибке

 csvReader = csv.reader(csvFile)
AttributeError: 'str' object has no attribute 'reader'
  

Это не имеет смысла, потому что тип (csvFile) не является str, и я делаю то же самое, что и выше?

Может кто-нибудь мне помочь, я очень расстраиваюсь!

Спасибо!

Комментарии:

1. локальное наследование функций внутри функции, похоже, не соответствует.

2. Если вы примете один из ответов, это поможет пометить проблему как решаемую, чтобы другим не нужно было пытаться помочь. meta.stackexchange.com/questions/5234 /…

Ответ №1:

Смотрите Встроенный комментарий, что пошло не так.

 import csv                           # "csv" variable at "with open..." overwrites
                                     # cvs module.
from csv import reader               # required to use the function "reader" from csv.

def createLeague(csv):               # "csv" variable overwrites cvs module.

  with open(csv, 'r') as csvFile:
    csvReader = reader(csvFile)      # skip the csv. here and it works for you.
    next(csvReader)

    for line in csvReader:
        print(line[0])
  return
  

В качестве альтернативы:

Приведенный ниже пример с измененным именем файла csv не перезаписывает модуль csv, который вы только что загрузили. Путаница вызывает возникновение ошибки.

 import csv
#from csv import reader

def createLeague(csv_file):

  with open(csv_file, 'r') as csvFile:    # changed variable "csv" filename.

    csvReader = csv.reader(csvFile)

    next(csvReader)

    for line in csvReader:
        print(line[0])
  return
  

Комментарии:

1. Большое спасибо за помощь, ребята! Я подумаю о том, чтобы не использовать имена библиотек в качестве переменных!

2. Учитывается также для имен встроенных в python; p

Ответ №2:

Не используйте имя библиотеки в качестве имени переменной в определении функции.