división Error cadena pitón, tiene longitud 1, se requiere 2

TheEditor:

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.

Avance:

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: valuebasan, y aumentarán una ValueErrorexcepció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..catchbloque. 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.

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=377667&siteId=1
Recomendado
Clasificación