Я пытаюсь написать программу на Python с использованием PyCharm и Python 3.3. Я хочу, чтобы моя программа копировала файлы из одного каталога в одну или несколько папок (в зависимости от файла конфигурации).

Поскольку некоторые каталоги, которые я пытаюсь скопировать в файлы, написаны на иврите, это файл 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
Ghost93 2 Апр 2013 в 16:34

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 (\ufeff, отклонение Microsoft от стандарта UTF-8), либо создайте файл, используя инструмент, который не добавляет этот символ (например, not Блокнот), откройте его с помощью кодека utf_8_sig:

config = configparser.ConfigParser()
config.read('RecorderMover.config.ini', encoding='utf-8-sig')
2
Martijn Pieters 1 Апр 2017 в 20:54
@ Ghost93: Вы создали этот файл с помощью редактора, который добавляет спецификацию UTF-8. Этот символ является избыточным в файлах UTF-8 и действительно должен быть удален.
 – 
Martijn Pieters
2 Апр 2013 в 16:48
Большое спасибо за Вашу помощь! Это сработало! Если кто-то еще хочет узнать, что такое спецификация - ссылка
 – 
Ghost93
2 Апр 2013 в 16:52