我试图运行我编写的代码 代码读取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;
答案 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]