Gareth
¿Cuál es la mejor manera de representar un directorio de Windows, por ejemplo "C:\meshes\as"
? He estado tratando de modificar una secuencia de comandos pero nunca funciona porque parece que no puedo obtener el directorio correcto, supongo que debido a la '\'
actuando como personaje de escape?
joaquín
puedes usar siempre:
'C:/mydir'
esto funciona tanto en linux como en windows. Otra posibilidad es
'C:\\mydir'
si tiene problemas con algunos nombres, también puede probar los literales de cadena sin procesar:
r'C:\mydir'
sin embargo, la mejor práctica es usar el os.path
Funciones del módulo que siempre seleccionan la configuración correcta para su sistema operativo:
os.path.join(mydir, myfile)
Desde python 3.4 también puedes usar el rutalib módulo. Esto es equivalente a lo anterior:
pathlib.Path(mydir, myfile)
o
pathlib.Path(mydir) / myfile
-
@Gareth, soy muy perezoso y, a menudo, me encontré usando ‘/’. Sin embargo, a la larga, el uso de os.path es más conveniente. También le permite usar mydir y myfile como variables que puede modificar fácilmente.
– joaquín
1 de junio de 2010 a las 22:48
-
Lo único que hay que tener cuidado con las cadenas sin procesar es que no pueden terminar con \
–Douglas Leeder
29 de junio de 2010 a las 16:15
-
Puede usar os.path.join() para eliminar la necesidad de terminar las rutas con \.
– Will Edger
5 de agosto de 2014 a las 14:53
-
Me gusta la sintaxis r (cadena sin formato). Útil si está copiando una ruta larga donde normalmente tendría que reemplazar todas las barras invertidas con barras inclinadas
– peterb
21 de agosto de 2016 a las 5:07
-
la cadena sin procesar puede terminar con \\ para que podamos concatenar un archivo a la ruta: codecs.open(r”C:\maXbox\EKON24\tweet_data\\” + file, ‘r’, encoding=’utf-8′) como F:
–Max Kleiner
24 de junio de 2020 a las 13:34
S. Lott
Utilizar el os.path
módulo.
os.path.join( "C:", "meshes", "as" )
O usa cuerdas sin procesar
r"C:\meshes\as"
También recomendaría que no haya espacios en la ruta o en los nombres de los archivos. Y podría usar barras invertidas dobles en sus cadenas.
"C:\\meshes\\as.jpg"
-
os.path.join puede no comportarse como espera cuando un componente es una letra de unidad, ya que incluso entonces se permiten rutas relativas. (El resultado de la primera línea es ‘C:mallas\\as’ en Windows).
– dash-tom-bang
1 de junio de 2010 a las 23:04
-
El comentario de @ dash-tom-bang es muy importante. ¿Es lo correcto hacer para poner
"C:\"
como la primera entrada? ¿Eso estropea un poco la limpieza del uso?join
?– Jack O´Connor
21 de febrero de 2014 a las 0:53
-
@ JackO’Connor eso es lo que hago. Seguro que no quieres poner
"C:\"
en medio del nombre del archivo. Además, puedes usaros.path.normpath
antes o después de una unión, para asegurarse de que la ruta se imprima correctamente.– Agostino
07/04/2015 a las 18:03
-
pero tampoco funciona. lo que funciona es
os.path.join( "C:\\", "meshes", "as" )
– Jean-François Fabre
♦2 de marzo de 2019 a las 11:32
-
@JackO’Connor, ¿estás tratando con Windows y te preocupa la limpieza? 😉
– Jürgen A. Erhard
8 de agosto de 2021 a las 9:36
bóveda
Sí, \
en los literales de cadena de Python indica el inicio de una secuencia de escape. En su camino tiene una secuencia de escape válida de dos caracteres \a
que se colapsa en uno personaje que es Campana ASCII:
>>> '\a'
'\x07'
>>> len('\a')
1
>>> 'C:\meshes\as'
'C:\\meshes\x07s'
>>> print('C:\meshes\as')
C:\meshess
Otras secuencias de escape comunes incluyen \t
(pestaña), \n
(linea de alimentación), \r
(retorno de carro):
>>> list('C:\test')
['C', ':', '\t', 'e', 's', 't']
>>> list('C:\nest')
['C', ':', '\n', 'e', 's', 't']
>>> list('C:\rest')
['C', ':', '\r', 'e', 's', 't']
Como puede ver, en todos estos ejemplos, la barra invertida y el siguiente carácter del literal se agruparon para formar un solo carácter en la cadena final. La lista completa de secuencias de escape de Python es aquí.
Hay una variedad de maneras de lidiar con eso:
-
Python no procesará secuencias de escape en cadenas literales con el prefijo
r
oR
:>>> r'C:\meshes\as' 'C:\\meshes\\as' >>> print(r'C:\meshes\as') C:\meshes\as
-
Python en Windows también debería manejar barras diagonales.
-
podrías usar
os.path.join
…>>> import os >>> os.path.join('C:', os.sep, 'meshes', 'as') 'C:\\meshes\\as'
-
… o el más nuevo
pathlib
módulo>>> from pathlib import Path >>> Path('C:', "https://stackoverflow.com/", 'meshes', 'as') WindowsPath('C:/meshes/as')
Aplazamiento de pago
Utilizar Path
:
from pathlib import Path
data_folder = Path("source_data/text_files/")
file_to_open = data_folder / "raw_data.txt"
print(file_to_open.read_text())
Path
toma una cadena similar a una ruta y ajusta todo para el sistema operativo actual, ya sea Windows o Linux. Por ejemplo, en Linux convertiría todas las barras invertidas en barras inclinadas, y en Windows haría lo contrario.
Articulo completo: Sugerencia rápida de Python 3: la manera fácil de manejar rutas de archivos en Windows, Mac y Linux
Mi experiencia:
- Pasé 6 meses usando
os.path.join(...)
luego cambió anormpath(...)
luego finalmente cambió aPath(...)
. Habiendo usado los tres, Path es el mejor de todos los mundos.
Ventajas de Path sobre os.path.join(...)
:
- Limpiador.
- Menos tipeo.
- Más fácil de leer las rutas (es decir, más legible).
- Puede unir dos caminos diferentes usando
/
(véase más arriba). - Más moderno.
Ventajas del camino sobre normpath(...)
:
- Puede unir caminos usando
/
en lugar de tener que volver a caeros.path.join(...)
con llamadas de ruta de norma anidadas para arreglar las cosas. - Limpiador.
- Menos tipeo.
- Más fácil de leer las rutas (es decir, más legible).
- Menos posibilidades de errores al realizar la migración entre Linux y Windows.
- Más moderno.
La cadena sin procesar de Python se crea anteponiendo un literal de cadena con ‘r’ o ‘R’. La cadena sin procesar de Python trata la barra invertida () como un carácter literal. Esto es útil cuando queremos tener una cadena que contenga una barra invertida y no queremos que se trate como un carácter de escape.
Hacer manualmente tales como:
WindowsPath("C:\meshes\as")
o usando r o R:
WindowsPath(r'C:/meshes/as')
Ver también: medio.com/swlh/…
– Desbordamiento del servidor
21 de marzo de 2022 a las 10:47