拆分字符串python时出错,长度为1,需要2

拆分字符串python时出错,长度为1,需要2,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我搞不清楚我做错了什么 以下是我的数据: clientSelect : Long Company Name Inc. server1Info : Server1 server1Pic : 200330135637030000.jpg server2Info : Server2 server2Pic : 200330140821800000.jpg modemInfo : Aries modemPic : 200330140830497000.jpg routerInfo : Router rou

我搞不清楚我做错了什么

以下是我的数据:

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::
这是一个字符串。它是通过sharepoint从sharepoint中提取的

lines = folder.get_file('main_equipment_list.txt')
lines =  lines.replace(",", "")

for row in lines.split(","):
有东西要分开

替换行用于处理某些信息中的逗号,这些信息在拆分之前不应该存在

一切都很好,直到它分裂,然后我不能把它变成一个dict从那里

我试过了

d = dict(s.split(':') for s in lines)
print d
这让我抓狂

  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
我得到:

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::
['switchGallery_media ', ' 200330140859161000.jpg\r']
但如果我这样做:

for row in lines.split(","):
#    print(row)
    for s in row:
        print(s[0])
我每行只有一个字符。如果我这样做了:

for row in lines.split(","):
#    print(row)
    for s in row:
        print(s[1])
我得到一个超出范围的错误

编辑:

我回去重新开始。一切都很好,直到我试着把行分开。以下是有效的方法

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)
我认为出错的原因有很多。主要是我对python的不熟悉,还有空格/额外的字符把我搞得一团糟

我在做一些测试。如果我使用这个:

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
我得到:

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::
['switchGallery_media ', ' 200330140859161000.jpg\r']
无论哪种方式都有效,我更了解一些事情。感谢@RoadRunner提供有关显示错误的帮助和提示

s.split(“:”)
将为您提供一个包含两个或多个元素的数组。e、 g.
[“客户选择”、“长公司名称公司”]

你必须从这个数组中选取元素来构造一个dict

d = {
  splited[0]: splited[1]
}
在我的python shell中:

In [1]: s = "clientSelect : Long Company Name Inc."

In [2]: x = s.split(":")

In [3]: x
Out[3]: ['clientSelect ', ' Long Company Name Inc.']

In [4]: d = {x[0]: x[1]}

In [5]: d
Out[5]: {'clientSelect ': ' Long Company Name Inc.'}
s.split(“:”)
将为您提供一个包含两个或多个元素的数组。e、 g.
[“客户选择”、“长公司名称公司”]

你必须从这个数组中选取元素来构造一个dict

d = {
  splited[0]: splited[1]
}
在我的python shell中:

In [1]: s = "clientSelect : Long Company Name Inc."

In [2]: x = s.split(":")

In [3]: x
Out[3]: ['clientSelect ', ' Long Company Name Inc.']

In [4]: d = {x[0]: x[1]}

In [5]: d
Out[5]: {'clientSelect ': ' Long Company Name Inc.'}

出现此错误是因为正在拆分空换行符和文件末尾的
::end::
。拆分这些行将同时给出
['\n']
['','end','','','','',']
。字典是基于
key:value
的,如果您给它更多或更少的项目来处理,它将引发
ValueError
异常

您可以在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
输出:

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'}

注意我如何打印异常以查看发生了什么。代码无法解包键和值对,因为它有两个以上的项要从
行解包。拆分(“:”
)。代码仍然创建了字典,但我记录了异常以查看实际发生的情况。这很方便查看您的代码哪里出错

出现此错误是因为您正在拆分空换行符和文件末尾的
::end::
。拆分这些行将同时给出
['\n']
['','end','','','','',']
。字典是基于
key:value
的,如果您给它更多或更少的项目来处理,它将引发
ValueError
异常

您可以在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
输出:

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'}

注意我如何打印异常以查看发生了什么。代码无法解包键和值对,因为它有两个以上的项要从
行解包。拆分(“:”
)。代码仍然创建了字典,但我记录了异常以查看实际发生的情况。这很方便查看您的代码哪里出错

在这种情况下,我发现编写
for
-循环并使用
try
-
块查看哪些项导致错误是很有用的<代码>对于行中的s:try:dict(s.split(“:”)除了ValueError:print(s)
@jakub Ok,这样做,看起来它会分割每个字符。我在控制台中每行有1个字符,所以我的问题是为什么分隔符是“:”?您能提供一个最小的代码来重现您的问题吗?目前还完全不清楚最初的数据实际上是如何转换的。例如,您对行执行
行=行。替换(“,”)
(意味着不再有
),然后对行中的行执行
。拆分(“,”)
(意味着拆分现在不存在的
)是因为“某些信息中的某些逗号”(不在示例输入中),但不执行任何操作,然后,稍后显示行中的行的
。拆分(“,”):打印(行)
复制初始数据。让我修复上面的代码。我意识到有变化。在这种情况下,我发现写下
for
-循环并使用
try
-
块查看哪些项导致了错误是很有用的<代码>对于行中的s:try:dict(s.split(“:”)除了ValueError:print(s)
@jakub Ok,这样做,看起来它会分割每个字符。我在控制台中每行有1个字符,所以我的问题是为什么分隔符是“:”?您能提供一个最小的代码来重现您的问题吗?目前还完全不清楚最初的数据实际上是如何转换的。例如,您对行执行
行=行。替换(“,”)
(意味着不再有
),然后对行中的行执行
。拆分(“,”)
(意味着拆分现在不存在的
)是因为“某些信息中的某些逗号”(不在示例输入中),但不执行任何操作,然后,稍后显示行中的行的
。拆分(“,”):打印(行)
复制初始数据。让我修复上面的代码。我意识到有变化。我明白了,但出于某种原因,它分裂了每一个字符。这就是它返回的内容。
try…catch
的替代方法是检查数组长度是否为2,如果不匹配,则忽略字典创建。我明白了,但出于某种原因,它会拆分每个字符。这就是它返回的内容。
try…catch
的替代方法是检查数组的长度是否为2,如果不匹配,则忽略字典创建。啊,好的。我想知道这是否是一个空白问题。让我试试。谢谢。@编辑帮了忙吗?好的。我去掉了::END::,删除了所有其他换行符。删除空白。管理我的公司