Просто чтобы помочь вам войти в Python немного больше:
Вы можете: 1. Читать весь файл сразу (если он большой, лучше захватить его в оперативную память, если у вас достаточно если вы не захватите столько, сколько можете, чтобы блок был разумным, то захватите еще один и т. д.) 2. Разделите данные, которые вы читаете, на слова и 3. Используйте set () или dict () для удаления дубликатов
Попутно вы не должны забывать обращать внимание на прописные и строчные буквы, если вам нужны одни и те же слова, а не просто разные не повторяющиеся строки
Это будет работать в Py2 и Py3 до тех пор, пока вы сделайте что-нибудь с функцией input () в Py2 или используйте кавычки при вводе пути, поэтому:
path = input("Filename: ")
f = open(filename)
c = f.read()
f.close()
words = set(x.lower() for x in c.split()) # This will make a set of lower case words, with no repetitions
# This equals to:
#words = set()
#for x in c.split():
# words.add(x.lower())
# set() is an unordered datatype ignoring duplicate items
# and it mimics mathematical sets and their properties (unions, intersections, ...)
# it is also fast as hell.
# Checking a list() each time for existance of the word is slow as hell
#----
# OK, you need a sorted list, so:
words = sorted(words)
# Or step-by-step:
#words = list(words)
#words.sort()
# Now words is your list
Что касается ваших ошибок, не беспокойтесь, они встречаются в начале практически на любом объектно-ориентированном языке. Другие хорошо объяснили их в своих комментариях. Но не для того, чтобы ответа не хватало ...:
Всегда обращайте внимание на функции или методы, которые работают с типом данных (вместо них sort - list.sort (), list.append (), list.insert ( ), set.add () ...) и какие из них возвращают новую версию типа данных (sorted (), str.lower () ...). Если вы столкнулись с подобной ситуацией снова, используйте help () в интерактивной оболочке, чтобы увидеть, что именно выполняет функция.
>>> help(list.append)
>>> help(list.sort)
>>> help(str.lower)
>>> # Or any short documentation you need
Python, особенно Python 3.x, чувствителен к попыткам операции между типами, но некоторые могут иметь различную коннотацию и могут фактически работать, делая неожиданные вещи. Например, вы можете сделать:
print(40*"x")
Он напечатает 40 символов "x", потому что он создаст строку из 40 символов. Но:
print([1, 2, 3]+None)
логически не будет работать, что и происходит в остальной части вашего кода.
В некоторых языках, таких как javascript (ужасные вещи), это будет работать отлично:
v = "abc "+123+" def";
Вставка 123 без проблем в строку. Это полезно, но программный кошмар и бессмыслица с другого угла обзора.
Кроме того, в Py3 разумное предположение от Py2 о том, что вы можете смешивать строки в Юникоде и байтах, и что автоматическое приведение c будет выполнено, не держа. Т.е. это TypeError:
print(b"abc"+"def")
, потому что b "ab c" - это bytes (), а "def" (или u "def") - это str () в Py3 - что такое unicode () в Py2)
Наслаждайтесь Python, это лучшее!