No puedo imaginar lo que estoy haciendo mal aquí.
Aquí está mi datos:
clientSelect : Long Company Name Inc.
server1Info : Server1
server1Pic : 200330135637030000.jpg
server2Info : Server2
server2Pic : 200330140821800000.jpg
modemInfo : Aries
modemPic : 200330140830497000.jpg
routerInfo : Router
routerPic : 200330140842144000.jpg
switchInfo : Switch1
switchGallery_media : 200330140859161000.jpg
buttonSubmit : Submit
::end::
Esto se encuentra actualmente en una cadena. Se sacó de SharePoint a través
lines = folder.get_file('main_equipment_list.txt')
lines = lines.replace(",", "")
for row in lines.split(","):
ALGO AQUÍ PARA SPLIT.
Thereplace línea es hacer frente a algunas comas en parte de la información que no debería estar allí antes de separarse.
Todo está bien hasta su escisión entonces no puede conseguirlo en un diccionario a partir de ahí.
He intentado
d = dict(s.split(':') for s in lines)
print d
Eso me pone
File "testShare.py", line 24, in <module>
d = dict(s.split(':') for s in row)
ValueError: dictionary update sequence element #0 has length 1; 2 is required
Así que lo que quiero es conseguir que en un diccionario.
Si hago esto:
for row in lines.split(","):
print(row)
Yo obtengo:
clientSelect : Long Company Name Inc.
server1Info : Server1
server1Pic : 200330135637030000.jpg
server2Info : Server2
server2Pic : 200330140821800000.jpg
modemInfo : Aries
modemPic : 200330140830497000.jpg
routerInfo : Router
routerPic : 200330140842144000.jpg
switchInfo : Switch1
switchGallery_media : 200330140859161000.jpg
buttonSubmit : Submit
::end::
Pero si hago esto:
for row in lines.split(","):
# print(row)
for s in row:
print(s[0])
Me sale un solo carácter de cada línea. Y si lo hago:
for row in lines.split(","):
# print(row)
for s in row:
print(s[1])
Me sale un error de rango.
Editar:
Volví y comenzó de nuevo. Todo estaba bien hasta que probé dividir las filas. Esto es lo que funciona.
lines = folder.get_file('main_equipment_list.txt')
lines = lines.rsplit("\n",2)[0]
d = {}
for line in lines.split("\n"):
if line.strip():
try:
k, v = map(str.strip, line.split(":"))
d[k] = v
except ValueError as ex:
print("on line" % (ex, line))
pass
print(d)
Lo que creo que iba mal fue varias cosas. Sobre todo mi desconocimiento de pitón, y espacios en blanco / caracteres adicionales Me estropear
Estaba haciendo algunas pruebas. Si utilizo el siguiente:
lines = lines.rsplit("\n",2)[0]
for line in lines.split("\n"):
if line.strip():
try:
x = line.split(":", 1)
print(x)
except ValueError as ex:
print("on line" % (ex, line))
pass
Yo obtengo:
['switchGallery_media ', ' 200330140859161000.jpg\r']
De cualquier forma en que funciona y lo entiendo algunas cosas mejor. Gracias @RoadRunner por la ayuda y consejos en mostrar errores.
Usted está recibiendo este error porque va a dividir la nueva línea vacía y el ::end::
al final del archivo. La división de las líneas tanto dar ['\n']
y ['', '', 'end', '', '']
. Los diccionarios se key: value
basan, y aumentarán una ValueError
excepción si le dan más o menos elementos a proceso.
Puede reproducir este excepción fácilmente en la shell:
>>> x = ["1:2", "3:4"]
>>> dict(y.split(":") for y in x)
{'1': '2', '3': '4'}
>>> x = ["1:2", "3"]
>>> dict(y.split(":") for y in x)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: dictionary update sequence element #1 has length 1; 2 is required
>>> x = ["1:2:3", "4:5:6"]
>>> dict(y.split(":") for y in x)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 3; 2 is required
Esto se puede evitar mediante la eliminación de espacio en blanco vacío o saltos de línea con strip()
y desembalaje de los artículos divididos en una tupla, que está vigilado por un try..catch
bloque. Este gestor de excepciones se activará cuando nos encontramos con una línea válida.
with open("data.txt") as f:
d = {}
for line in f:
# avoid empty lines
if line.strip():
try:
# unpack key and value into tuple and strip whitespace
k, v = map(str.strip, line.split(":"))
# strip whitespace after splitting
d[k] = v
# catch error and print it out
# use pass to just ignore the error
except ValueError as ex:
print("%s occured on line: %s" % (ex, line))
pass
print(d)
Salida:
too many values to unpack (expected 2) occured on line: ::end::
{'clientSelect': 'Long Company Name Inc.', 'server1Info': 'Server1', 'server1Pic': '200330135637030000.jpg', 'server2Info': 'Server2', 'server2Pic': '200330140821800000.jpg', 'modemInfo': 'Aries', 'modemPic': '200330140830497000.jpg', 'routerInfo': 'Router', 'routerPic': '200330140842144000.jpg', 'switchInfo': 'Switch1', 'switchGallery_media': '200330140859161000.jpg', 'buttonSubmit': 'Submit'}
Observe cómo Imprimí la excepción a ver qué pasaba. El código no era capaz de desempaquetar los pares de clave y valor, porque tenía más de 2 artículos para desempaquetar desde line.split(":")
. El código todavía crea el diccionario, pero que registra las excepciones a ver lo que estaba ocurriendo realmente. Esto es útil para ver donde el código va mal.