在python上将列表转换为整数

时间:2017-07-19 12:03:17

标签: python list file int

我试图运行我编写的代码 代码读取txt文件中的行 所以我的文本文件看起来像(我有20行)

  

[' 39',' 40',' 39',' 38',' 35',& #39; 38',' 39',' 39',' 42',' 37',' 40&# 39;,' 41',' 37',' 39',' 39',' 40',&# 39; 38',' 40',' 39',' 40']

     

[' 39',' 40',' 39',' 38',' 36',& #39; 39',' 40',' 39',' 42',' 38',' 40&# 39 ;,   ' 41',' 38',' 39',' 39',' 40',' 38& #39;,' 40',' 39',' 41']

     

[' 39',' 40',' 40',' 38',' 36',& #39; 39',' 40',' 39',' 43',' 38',' 40&# 39 ;,   ' 41',' 38',' 39',' 39',' 40',' 38& #39;,' 40',' 39',' 41']

我写了这个脚本,有一个看起来像这样的新文件

  

39 40 39 38 35 38 39 39 42 37 40 41 37 39 39 40 38 40 39 40

     

39 40 39 38 36 39 40 39 42 38 40 41 38 39 39 40 38 40 39 41

     

39 40 40 38 36 39 40 39 43 38 40 41 38 39 39 40 38 40 39 41

我写的脚本就是这个

    #!/usr/bin/python3
# -*- coding: utf-8 -*-

fichier=open("data.txt", "r")
#resultat=open("data_entier.txt", "w")

j=0;

while j < 20:
    lignes= fichier.readline()
    for i in range(len(lignes)):
         lignes[i] = int(lignes[i])

    print(lignes))

    j+=1

fichier.close()

我得到的错误就是这个

  

ValueError:基数为10的int()的文字无效:&#39; [&#39;

4 个答案:

答案 0 :(得分:4)

问题在于,当您从文件中读取readline时,您将有一行

"['39', '40', '39', '38', '35', '38', '39', '39', '42', '37', '40', '41', '37', '39', '39', '40', '38', '40', '39', '40']\n"

如您所见,字符串中的第一项是[。因此,您实际上并没有像您期望的那样构建数字。相反,由于您似乎已经将 list 结构表示为字符串,请考虑使用ast中的literal_eval

>>> d = literal_eval(d)
>>> d
['39', '40', '39', '38', '35', '38', '39', '39', '42', '37', '40', '41', '37', '39', '39', '40', '38', '40', '39', '40']

现在你实际上有一个列表的字符串。现在,您可以继续修改 到您的整数。作为一个简单的过程,您可以执行以下操作:

>>> converted_to_ints = map(int, d)
>>> print(list(converted_to_ints))
[39, 40, 39, 38, 35, 38, 39, 39, 42, 37, 40, 41, 37, 39, 39, 40, 38, 40, 39, 40]

注意,在Python 3中使用map时,会得到一个 map对象,它返回一个迭代器。因此,如果您需要列表,这就是打印时调用list的原因。你可以在这里阅读:

https://docs.python.org/3/library/functions.html#map

改善范围

根据您正在阅读的文件的内容, best 不会像这样构建数据。相反,应该做的不是将数据设置为文件中的列表表示,而只是列表的内容。这避免了必须执行上述解决方案,而是一个简单的:

with open('file.txt') as f:
  data = f.read().splitlines() # will remove newline character
  for line in data:
      # perform operations

就足够了。

答案 1 :(得分:2)

将该行评估为列表:每一行都只是一个恰好以'['开头的字符串。所以你正在遍历该行的字符

如果文件与您描述的文件类似,则可以使用ast.literal_eval轻松评估行:

from ast import literal_eval

with open("data.txt", "r") as fichier:
    for line,_ in zip(fichier,range(20)):
        the_list = literal_eval(line)
        the_list = [int(x) for x in the_list]
        print(the_list))

我们在这里使用zip作为获取前20行的方法。如果您想要处理所有行,您只需使用:

with open("data.txt", "r") as fichier:
    for line in fichier:
        the_list = literal_eval(line)
        the_list = [int(x) for x in the_list]
        print(the_list))

答案 2 :(得分:0)

你正在读一行,所以你可以简单地替换你不想要的字符。

string = "['39', '40', '39', '38', '35', '38', '39', '39', '42', '37', '40', '41', '37', '39', '39', '40', '38', '40', '39', '40']"
s = string.replace(',','').replace('[','').replace(']','').replace("'","")
print s
#output: 39 40 39 38 35 38 39 39 42 37 40 41 37 39 39 40 38 40 39 40

答案 3 :(得分:0)

虽然在这种情况下,idjaw和Willem Van Onsem提出的ast.literal_eval解决方案似乎显然是最合适的,但让我提出另一个解决方案:

numbers_text = "['39', '40', '39', '38', '35', '38', '39', '39', '42', '37', '40', '41', '37', '39', '39', '40', '38', '40', '39', '40']"

通过向replace提供第三个参数,您可以使用str.translate在一次传递中删除多个字符,而不是链接多个str.maketrans操作:

  

如果有第三个参数,则必须是一个字符串,其结果中的字符将映射到None

之后,我们可以使用简单的list comprehension将单独的数字从str转换为int

numbers_int = [int(x) for x in numbers_text.translate(str.maketrans("","","[',]")).split()]

或者使用map

numbers_int = list(map(int, numbers_text.translate(str.maketrans("","","[',]")).split()))

两者都会产生新的list int

[39, 40, 39, 38, 35, 38, 39, 39, 42, 37, 40, 41, 37, 39, 39, 40, 38, 40, 39, 40]