2016-09-22 165 views
-1

现在,我的代码将创建一个文本文件,其中包括列表中每个单词的位置以及列表中的每个单词 - 像这样:TypeError:不支持的操作数类型为 - :'str'和'int'

file content

我的代码然后打开备份文件,应该能够重新使用这些位置,并在文本文件中的单词句,但它似乎不与工作readlines代码出于某种原因。

openfilename = open(openfilename,"r") 
readlines = openfilename.readlines() 

wordslist = readlines[0] 
positionslist = readlines[1] 

print(positionslist) 
print(wordslist) 

originalsentence = " ".join([wordslist[x-1] for x in positionslist]) 
print(originalsentence) 

例如,这又发表了wordslist和positionslist出来为:

[1, 2, 3, 2] 
['test123', ',', '.'] 

在哪里,好像我是用:

positionslist = [1, 2, 3, 2] 
wordslist = ['test123', ',', '.'] 
originalsentence = " ".join([wordslist[x-1] for x in positionslist]) 
print(originalsentence) 

它的工作,我也没有想法为什么,因为作为python的新手,你会认为他们的工作原理是一样的。看着别人的具有相同的错误后,我理应缺少

(int(...) 

行代码的地方,但我不知道在哪里,或者如果这是连问题。

+0

某些Stackoverflow用户不会打开随机链接,而应该粘贴图像。在这种情况下,屏幕截图是过分的,因为它只有两行,因此描述文件中的内容实际上更简单。因为@ Jean-FrançoisFabre无法正确回答你的问题。无论如何,我很高兴能有所帮助。欢迎来到Stackoverflow! –

+0

@MaxChrétien我的截图不好,我会记住我的未来问题。顺便谢谢你的帮助,我很感激。 – Mika1996

回答

2

另一种解决方案是使用ast.literal_eval()到您的字符串u'[1, 2, 3, 2]直接转换成整数的列表:

import ast 

with open(openfilename, "r") as f: 
    positionslist = ast.literal_eval(f.readline()) 
    wordslist = ast.literal_eval(f.readline()) 

    print(" ".join([wordslist[x-1] for x in positionslist])) 

此外,with语句代替try和catch。它也会在块后自动关闭文件。

+1

你是唯一一个真正打开输入图像的人。好的问题格式不好。但无论如何都是很好的答案 –

+0

@ Jean-FrançoisFabre感谢您使堆栈溢出社区更好:) –

2

编辑:这个答案假设一个“原始”格式。它不会在这里工作。它工作,如果readlines[1]已经是一个字符串列表通过拆分像"1 4 5 6 7",这不是这里的情况,因为行包含一个Python列表写入str(list)ast.literal.eval在这种情况下是正确的选择,如果输入格式是令人满意的而不是首先出现的错误。

当你这样做:

positionslist = readlines[1] 

没有办法,你不是包含整数字符串列表以外的东西。你必须像这样转换他们:

positionslist = [int(x) for x in readlines[1]] 

在你的硬编码的例子,你直接使用整数,它的工作原理。

注:为cricket_007建议,因为你只是positionslist迭代,你可以使用

positionslist = map(int,readlines[1]) 

它应用int功能的readlines[1]每个项目,返回一个迭代(在Python 2返回list,所以不与那种情况下的列表理解大不相同)。

在Python 3中,避免了创建/分配不需要的列表,因为您不使用索引(如果因为只能迭代一次就无法使用索引进行调试)所以它更高效。

当然,如果某些行不是一个数字,将有一个明确的错误ValueError: invalid literal for int() with base 10

+0

或'positionslist = map(int,readlines [1])' –

+0

是的,即使在python 3中也可以工作,因为我们使用列表仅仅用于迭代,而不用于索引。编辑它。 –

+0

由于我的防火墙,我看不到您的文件格式。将输入文件作为文本发布会更好。在这种情况下,您需要使用ast.literal_eval()来直接在Python中解释列表,正如Max Chretien所建议的那样。这可能是因为你使用python和'str(yourlist)'编写了输入文件,而不是逐个写入你的值。 –

0

的问题是崩溃,当你从文件中读取,该值是str类型默认的。当您尝试在[wordslist[x-1] for x in positionslist]中执行x-1时,由于您尝试从字符串中尝试subtract 1,您会收到错误。为了解决这个问题,转换positionslist列出INT公司为:

positionslist = readlines[1] 
positionslist = map(int, positionslist) # <-- add this line in your code 

,你的代码将工作。检查map()了解它。

相关问题