Domanda

I'm trying to write a python program using PyCharm and Python 3.3. What I want to do is that my program will copy files from one directory, to one folder or more (depending on the configuration file).

Since some of the directories I am trying to copy to the files are in Hebrew, the ini file is utf-8.

But, when I read the configuration from that file this is what I get:

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

What am I doing wrong?

È stato utile?

Soluzione

You need to use the .read_file() method on your config instance instead:

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

The .read() method treats f as a sequence of filenames instead, and as none of the lines could ever be interpreted as a filename, the configuration ends up empty.

Alternatively, pass in the filename and encoding to .read() without opening the file yourself:

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

If your input file contains a UTF-8 BOM (\ufeff, a Microsoft devation from the UTF-8 standard) either create the file using a tool that doesn't add that character (e.g. not Notepad), use the utf_8_sig codec to open it:

config = configparser.ConfigParser()
config.read('RecorderMover.config.ini', encoding='utf-8-sig')
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top