Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从xlsx创建字典:TypeError:类型为';书籍';这是不可容忍的_Python_Dictionary_Typeerror_Xlsx_Xlrd - Fatal编程技术网

Python 从xlsx创建字典:TypeError:类型为';书籍';这是不可容忍的

Python 从xlsx创建字典:TypeError:类型为';书籍';这是不可容忍的,python,dictionary,typeerror,xlsx,xlrd,Python,Dictionary,Typeerror,Xlsx,Xlrd,我对Python(和xlrd模块)非常陌生,所以我的代码可能没有它可能的那么紧凑。我只是用它来分析一些数据,所以对我来说,更重要的是了解我正在做的事情,而不是让代码尽可能紧凑(虽然我确实希望改进,所以请随意给我一些关于编码本身的建议,只要你能设法向“新手”解释一下:p) 话虽如此,我的问题是: 上下文 我有一个xlsx文件,其中包含人们在翻译文本时所犯错误的数据。第一列包含相对于文本的错误代码(概念错误),第二列包含产生错误的翻译人员的代码。我想创建一个字典,其中键是概念错误代码,值是产生概念错

我对Python(和xlrd模块)非常陌生,所以我的代码可能没有它可能的那么紧凑。我只是用它来分析一些数据,所以对我来说,更重要的是了解我正在做的事情,而不是让代码尽可能紧凑(虽然我确实希望改进,所以请随意给我一些关于编码本身的建议,只要你能设法向“新手”解释一下:p)

话虽如此,我的问题是:

上下文

我有一个xlsx文件,其中包含人们在翻译文本时所犯错误的数据。第一列包含相对于文本的错误代码(概念错误),第二列包含产生错误的翻译人员的代码。我想创建一个字典,其中键是概念错误代码,值是产生概念错误的不同翻译人员的列表

xlsx中的一个简短片段(让您了解两列中的代码):

如您所见,概念错误“1722_Z1_CF5”是由两个不同的人造成的(“1722_HT_EV_Z1_F1”和“1722_PE_LH_Z1_F1”)。此片段的字典如下所示:

1722_Z1_CF5: 1722_HT_EV_Z1_F1, 1722_PE_LH_Z1_F1
1722_Z1_CF1: 1722_PE_AL_Z1_F1 
1722_Z1_CF9: 1722_PE_EVC_Z1_F1
代码

下面的代码是我试图创建字典的代码

def TranslatorsPerError(sheet):

    TotalConceptualErrors(sheet)

    TranslatorsPerError = {}

    for row_index in range(sheet.nrows):
        if sheet.cell(row_index,0).value in ConceptualErrors and sheet.cell(row_index,0).value not in TranslatorsPerError:
            TranslatorsPerError[str(sheet.cell(row_index,0).value)]=[str(sheet.cell(row_index,1).value),]           

        if sheet.cell(row_index,0).value in ConceptualErrors and sheet.cell(row_index,0).value in TranslatorsPerError:
            TranslatorsPerError[str(sheet.cell(row_index,0).value)].append(str(sheet.cell(row_index,1).value))  

return TranslatorsPerError
“TotalConceptualErrors”是我创建的一个函数,它从第一列返回概念错误代码的列表(“ConceptualErrors”),没有重复项(并且它过滤掉了第一列中也存在的一些其他信息,这就是为什么我需要先使用这个信息)

问题

问题是这个函数一直给我一个错误:TypeError:type'Book'的参数不可编辑

我知道iterables的问题有时可以通过将某些东西转换成不同的类型来解决,但我不确定该如何解决这个问题。我尝试对不同的元素使用'str()',但这并没有解决问题。也许这与我的代码有关,也许与字典或xlrd的性质有关。。。(看看“书”的类型,我猜是后者)


任何关于如何解决此问题的帮助或反馈都将不胜感激。如果你需要额外的信息来了解发生了什么或我在寻找什么,请询问

在哪里设置ConceptualErrors?

ConceptualErrors是一个从“TotalConceptualErrors(sheet)”返回的列表,它的糟糕设计是在程序中设置全局变量。您应该让它返回一个列表,并在上述函数中将返回值设置为局部变量。看看上面的代码,我认为它与列表的返回方式有关。请检查抛出错误的行,并通过打印检查该行上的变量。列表、字典、字符串都是可编辑的,在Python中出现得最频繁。如果您的变量不是其中之一,那么它可能是不可写的。好吧,我通过在函数“TranslatorPerErrors”中调用它作为“ConceptualErrors=TotalConceptualErrors(sheet)”,并删除If块中的str()来解决它。它现在输出我要的字典。谢谢你的帮助@你能用一些实际的解决方案而不是一个问题来更新答案吗?因此,它有助于人们将来访问它。
def TranslatorsPerError(sheet):

    TotalConceptualErrors(sheet)

    TranslatorsPerError = {}

    for row_index in range(sheet.nrows):
        if sheet.cell(row_index,0).value in ConceptualErrors and sheet.cell(row_index,0).value not in TranslatorsPerError:
            TranslatorsPerError[str(sheet.cell(row_index,0).value)]=[str(sheet.cell(row_index,1).value),]           

        if sheet.cell(row_index,0).value in ConceptualErrors and sheet.cell(row_index,0).value in TranslatorsPerError:
            TranslatorsPerError[str(sheet.cell(row_index,0).value)].append(str(sheet.cell(row_index,1).value))  

return TranslatorsPerError