Ошибка при попытке открыть изображение в python [duplicate]

Думаю, у вас есть правильная идея. Структуры создаются для имитации типов данных. Они основаны на стоимости, а не на основе ссылок. Если вы посмотрите документацию MSDN для большинства базовых классов данных (int, double, decimal, ect.), Все они основаны на структурах. Тем не менее, однако, по этой же причине структуры не следует злоупотреблять. Комната для хранения всего всего в этой структуре выделяется сразу после ее создания, когда классы просто выделяют место для ссылки на все внутри. Если данные находятся в достаточно маленьких кусках, где это не проблема, а структуры - это путь. Если это проблема, обратитесь к классам. Если вы не знаете, как лучше всего придерживаться того, с чем вы знакомы.

66
задан vaultah 31 March 2018 в 11:46
поделиться

3 ответа

вы можете использовать всегда:

'C:/mydir'

это работает как в linux, так и в окнах. Другая возможность -

'C:\\mydir'

, если у вас есть проблемы с некоторыми именами, вы также можете попробовать сырые строковые литералы:

r'C:\mydir'

, однако лучше всего использовать функции модуля os.path которые всегда выбирают правильную конфигурацию для вашей ОС:

os.path.join(mydir, myfile)
111
ответ дан Aran-Fey 15 August 2018 в 15:29
поделиться
  • 1
    Спасибо, ребята, '/' отлично поработали, но другие подсказки оценены. – Gareth 1 June 2010 в 23:35
  • 2
    @Gareth, я очень ленив и часто обнаруживаю, что использую '/'. Однако в конечном итоге использование os.path более удобно. Он также позволяет вам использовать mydir и myfile в качестве переменных, которые вы можете легко изменить. – joaquin 1 June 2010 в 23:48
  • 3
    Единственное, что нужно делать с необработанными строками, это то, что они не могут закончиться \ – Douglas Leeder 29 June 2010 в 17:15
  • 4
    Вы можете использовать os.path.join (), чтобы удалить необходимость завершения путей с помощью \. – Will Ediger 5 August 2014 в 15:53
  • 5
    Мне нравится синтаксис r (raw string). Полезно, если вы копируете длинный путь, где обычно вам нужно заменить все обратные косые черты косой чертой – peterb 21 August 2016 в 05:07

Используйте модуль os.path.

os.path.join( "C:", "meshes", "as" )

Или используйте необработанные строки

r"C:\meshes\as"
12
ответ дан S.Lott 15 August 2018 в 15:29
поделиться
  • 1
    os.path.join может не вести себя так, как вы ожидаете, когда компонент является буквой диска, поскольку относительные пути разрешены даже тогда. (Результатом первой строки является «C: meshes \\ as» в Windows.) – dash-tom-bang 2 June 2010 в 00:04
  • 2
    Комментарий @ dash-tom-bang действительно важен. Правильно ли это сделать, чтобы положить "C:\" в качестве первой записи? Означает ли это, что из-за чистоты использования join? – Jack O'Connor 21 February 2014 в 02:53
  • 3
    @ JackO'Connor, вот что я делаю. Вы, конечно же, не хотите помещать "C:\" в середину имени файла. Кроме того, вы можете использовать os.path.normpath до или после соединения, чтобы убедиться, что путь печатается красиво. – Agostino 7 April 2015 в 18:03

Да, \ в строковых литералах Python обозначает начало escape-последовательности. На вашем пути у вас есть действительная двухсимвольная escape-последовательность \a, которая сжимается на символ one , который является ASCII Bell :

>>> '\a'
'\x07'
>>> len('\a')
1
>>> 'C:\meshes\as'
'C:\\meshes\x07s'
>>> print('C:\meshes\as')
C:\meshess

Другие общие escape-последовательности включают в себя \t (вкладка), \n (строка), \r (возврат каретки):

>>> list('C:\test')
['C', ':', '\t', 'e', 's', 't']
>>> list('C:\nest')
['C', ':', '\n', 'e', 's', 't']
>>> list('C:\rest')
['C', ':', '\r', 'e', 's', 't']

Как вы можете видеть, во всех этих примерах обратная косая черта и следующий символ в литерале были сгруппированы вместе, чтобы сформировать единственный символ в финальной строке. Полный список управляющих последовательностей Python здесь здесь .

Существует множество способов борьбы с этим:

  1. Python будет не обрабатывать escape-последовательности в строковых литералах с префиксом r или R :
    >>> r'C:\meshes\as'
    'C:\\meshes\\as'
    >>> print(r'C:\meshes\as')
    C:\meshes\as
    
  2. Python в Windows также должен обрабатывать косые черты.
  3. используйте os.path.join ...
    >>> import os
    >>> os.path.join('C:', os.sep, 'meshes', 'as')
    'C:\\meshes\\as'
    
  4. ... или новый pathlib модуль
    >>> from pathlib import Path
    >>> Path('C:', '/', 'meshes', 'as')
    WindowsPath('C:/meshes/as')
    
5
ответ дан vaultah 15 August 2018 в 15:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: