2013-04-02 1 views
0

Я пытаюсь написать программу python с помощью PyCharm и Python 3.3. Что я хочу сделать, так это то, что моя программа будет копировать файлы из одного каталога, в одну папку или более (в зависимости от файла конфигурации).KeyError при чтении конфигурации из utf-8 .ini-файла с помощью configparser

Поскольку некоторые из каталогов, которые я пытаюсь скопировать в файлы, находятся на иврите, ini-файл - utf-8.

Но, когда я прочитал конфигурацию из этого файла это то, что я получаю:

C:\Python33\python.exe C:/Users/Username/PycharmProjects/RecorderMover/RecorderMover.py 
Traceback (most recent call last): 
    File "C:/Users/Username/PycharmProjects/RecorderMover/RecorderMover.py", line 77, in <module> 
    sourcePath, destPaths, filesToExclude = readConfig() 
    File "C:/Users/Username/PycharmProjects/RecorderMover/RecorderMover.py", line 62, in readConfig 
    config = config['RecorderMoverConfiguration'] 
    File "C:\Python33\lib\configparser.py", line 942, in __getitem__ 
    raise KeyError(key) 
KeyError: 'RecorderMoverConfiguration' 

RecorderMover.py:

def readConfig(): 
    config = configparser.ConfigParser() 

    with codecs.open('RecorderMover.config.ini', 'r', encoding='utf-8') as f: 
     config.read(f) 

    config = config['RecorderMoverConfiguration'] 

    sourcePath = config['SourcePath'] 
    destPaths = config['DestinationPaths'] 
    filesToExclude = config['FilesToExclude'] 

RecorderMover.config.ini:

[RecorderMoverConfiguration] 
SourcePath=I:\VOICE\A 
DestinationPaths=D:\RoseBackup,E:\רוזה 
FilesToExclude=20.08.12.mp3 

Что я делаю неправильно?

ответ

1

Вы должны использовать метод .read_file() на вашем config Например, вместо:

with open('RecorderMover.config.ini', 'r', encoding='utf-8') as f: 
    config.read_file(f) 

Метод .read() рассматривает f как последовательность имен файлов вместо этого, и, как ни одна из линий не мог быть интерпретирован как имя файла, конфигурация заканчивается пустым.

В качестве альтернативы, можно передать имя файла и кодировки в .read() без открытия файла самостоятельно:

config = configparser.ConfigParser() 
config.read('RecorderMover.config.ini', encoding='utf-8') 

Если входной файл содержит UTF-8 BOM (\ufeff, а devation Microsoft со стандартом UTF-8) либо создать файл с помощью инструмента, который не добавляет этот символ (например, не Notepad), используйте utf_8_sig кодек, чтобы открыть его:

config = configparser.ConfigParser() 
config.read('RecorderMover.config.ini', encoding='utf-8-sig') 
+0

@ Ghost93: Вы создали файл с электронной ditor, который добавляет спецификацию UTF-8. Этот символ избыточен в файлах UTF-8 и должен быть удален. –

+0

Большое спасибо за помощь! Это сработало! Если кто-то еще хочет знать, что такое спецификация - [ссылка] (http://stackoverflow.com/questions/2223882/whats-different-between-utf-8-and-utf-8-without-bom) – Ghost93