contacts.items()
возвращает пары ключ-значение. В вашем случае это будет что-то вроде
(("John", 938477566), ("Jack", 938377264), ("Jill", 947662781))
За исключением того, что в Python 3 это похоже на генератор, а не список. Поэтому вам нужно будет сделать list(contacts.items())
, если вы хотите проиндексировать его, что объясняет ваше сообщение об ошибке. Однако, даже если вы сделали list(contacts.items())[0]
, как обсуждалось выше, вы получите первую пару ключ-значение.
Что вы пытаетесь сделать, это получить значение ключа, если указанный ключ существует, и contacts.get(key, value_if_key_doesnt_exist)
сделает это за вас.
contact = 'John'
# we use 0 for the default value because it's falsy,
# but you'd have to ensure that 0 wouldn't naturally occur in your values
# or any other falsy value, for that matter.
details = contacts.get(contact, 0)
if details:
print('Contact details: {} {}'.format(contact, details))
else:
print('Contact not found')
Когда приложение (WinForms) запускает, Environment.CurrentDirectory
содержит путь к папке приложения (т.е. папка, которая содержит .exe блок). Используя любое из Диалоговых окон Файла, напр. OpenFileDialog
, SaveFileDialog
, и т.д. заставит текущий каталог изменяться (если другая папка была выбрана).
При выполнении службы Windows ее содержание папки является C:\Windows\System32, как это - Системная папка, и это - Система (т.е. Операционная система), который на самом деле выполняет службу Windows.
Обратите внимание что, указав относительный путь в большей части System.IO
объекты, отступит к использованию Environment.CurrentDirectory
свойство.
Как упомянуто, существует несколько способов получить путь сервисного исполняемого файла, с помощью Assembly.GetEntryAssembly()
или Assembly.GetExecutingAssembly()
и затем использование любого Location
свойство или CodeBase
свойство (знать, что это - путь к файлу, не каталог, исполняемого файла).
Другая опция состоит в том, чтобы использовать:
`System.IO.Directory.SetCurrentDirectory( System.AppDomain.CurrentDomain.BaseDirectory );`
Выполните вызов в Сервисе OnStart
метод, применяя его к целому приложению.
Это основано на текущем рабочем каталоге, который может или не может совпасть с, где Ваше приложение находится, особенно, если запущено с другой программы или ярлыка с другим рабочим каталогом.
Вместо твердого кода путь, получите путь к своей программе и используйте его. Можно сделать это с чем-то вроде этого
Assembly ass = Assembly.GetEntryAssembly();
string dir = Path.GetDirectoryName(ass.Location);
string filename = Path.Combine( dir, "CAISLog.csv" );
Это предполагает, что блок записи состоит в том, где Ваш файл. В противном случае можно изменить получение блока для чего-то как;
Assembly ass = Assembly.GetAssembly( typeof( AClassInYourAssembly ) );
Можно использовать это для определения пути, который находится в том же пути exe "..\CAISLog.csv". Обратите внимание на то, что двойные точки обращаются к родительскому каталогу того, где когда-либо Ваш .exe находится.
RWendi
Разрешение Относительного пути никогда не работает против пути запускающегося исполняемого файла. Это всегда работает против Текущего каталога процесса, и Вы не можете действительно ожидать, что, чтобы всегда быть установленным на каталог .exe живет в.
Если Вы нуждаетесь в том поведении, то заботитесь, чтобы узнать правильный путь самостоятельно и обеспечить полностью определенный путь к операциям файла.