2014-09-28 3 views
-2

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

Мой код для чтения в словаре и замены символов выглядит следующим образом.

d = {} 
def read_clues(clues): 
    global d 
    with open("hey.txt") as f: 
     for line in f: 
      (key, val) = line[1], line[0] 
      d[key] = val 


def replace_symbols(clues, words): 
    global d 
    for word in range(len(words)): 
     for key, value in d.items(): 
      words[word] = words[word].replace(key, value) 

В основной части моей программы у меня есть код для вызова replace_symbols. Однако я получаю синтаксическую ошибку после ключа печати в последней строке. Код для этого показан ниже.

#REPLACES LETTERS 
print("======== The clues have been replaced ===========") 
replace_symbols(clues, words) 
for key, value in d.items(): 
    print key, value // This will print the symbols and letters 
+0

Попробуйте прочитать полное сообщение об ошибке (все это), как правило, указывает вам, где именно лежит проблема - попробуйте подумать, почему эта часть может быть синтаксической ошибкой –

+1

Также, если вы хотите помочь с определенной ошибкой, вы должны _post_ полное сообщение об ошибке, а не просто описывать это смутно. Ошибка (или другой вывод) является частью вашего [минимального, полного, проверяемого примера] (http://stackoverflow.com/help/mcve), а не только кода. – abarnert

+0

Также, какую версию Python вы используете? Вы смешиваете функцию 'print' Python 3 и инструкцию' print' Python 2. Если вы на Python 3, последним будет «SyntaxError». Если вы находитесь на Python 2, они оба будут работать, но стиль функции может давать неожиданные результаты в различных случаях (например, 'print (1, 2)' будет печатать кортеж '(1, 2)' вместо печати '1 2'). – abarnert

ответ

1

Предполагая, что hey.txt имеет ключи и значения, разделенные пространства, следующий код должен работать:

def read_clues(clues): 
    global d 
    with open("hey.txt") as f: 
     for line in f: 
      stuff = line.split(" ") #split each line into parts 
      (key, val) = stuff[1], stuff[0] 
      d[key] = val 

Если разделитель отличен от пространства, просто включить его в качестве аргумента до split().

+0

А как насчет замены подсказок? – Paul

+0

Сообщите мне точную ошибку, которую вы получаете. – jazdev

+0

для fw_line, fs_line in (fw, fs): ValueError: слишком много значений для распаковки (ожидается 2) – Paul

0

Есть некоторые другие проблемы в коде, но так как вы спрашиваете об ошибке синтаксиса, это почти наверняка эта линия:

print key, value // This will print the symbols and letters 

Во-первых, // не означает «комментарий» в Python, это означает «целочисленное деление». Итак, вы просите его разделить value на This (что, вероятно, поднимет NameError, потому что маловероятно, что у вас есть что-то с именем This в вашем коде), а затем включая кучу других идентификаторов, начиная с will. Строка из двух идентификаторов в строке является недопустимым синтаксисом.

Как сделать Вы пишете комментарий на Python? Используйте #, не //:

print key, value # This will print the symbols and letters 

Во-вторых, если вы используете Python 3.x, print нормальная функция, как и все остальное, так что его аргументы должны идти в скобках, как все ваши другой функции звонки. (И, учитывая print, позвоните несколько строк вверх, я готов поспорить, что вы : с помощью Python 3.x.) Скорее всего, вы скопировали это из некоторого кода для Python 2.x. Существуют некоторые важные различия между Python 2 и 3, что означает, что не весь код для Python 2 можно скопировать и вставить в ваш Python 3. И это один из случаев, когда он не работает. Итак:

print(key, value) # This will print the symbols and letters 

Но не сделать это второе изменение, если вы используете Python 2.x; в противном случае вы просто закончите печать кортежа вместо двух строк, разделенных пробелом. (Например, print 1, 2 печатает 1 2, но print(1, 2) отпечаток (1, 2).)

0

Помимо указанных в других постах вопросов:

  • print против print() (в зависимости от версии питона)
  • комментирования с помощью # (// является не комментария)

Ваш код делает:

for line in f: 
    (key,val) = line[1], line[0] 

Это означает, что line - это каждая строка. Предположим, что строка - это только символ новой строки без другого текста. Затем вы получите IndexError при попытке прочитать line[1].

Кроме того, это, вероятно, проблема с дизайном. Когда вы читаете line[1] и line[0], по сути, вы просто читаете первый и второй символы в строке, что, вероятно, не то, что вы намереваетесь сделать.

Как указал @abarnert, ваш оригинальный SyntaxError, вероятно, возникает из двух упомянутых им пунктов. IndexError вы получаете при использовании @jazdev

Смежные вопросы