我试图遍历文本文件每行中的第一个数字。这是我的代码:
f = open('test.txt')
for line in iter(f):
print line[1]
f.close()
这是我尝试迭代的文本文件:
[11, (28, 33, 45, 55, 62, 66)]
[10, (28, 33, 45, 55, 62, 66.69)]
[9, (28, 33, 45, 55, 62, 67)]
[7, (28, 33, 45, 55, 62, 69)]
[6, (28, 33, 45, 55, 62, 69.69)]
[8, (28, 33, 45, 55, 62, 74)]
[11, (28, 33, 45, 55, 62, 75.86)]
[11, (28, 33, 45, 55, 62, 76)]
[12, (28, 33, 45, 55, 62, 76.69)]
[13, (28, 33, 45, 55, 62, 77.86)]
不幸的是,这段代码产生了值1,1,9,7等,而不是我正在寻找的东西(11,10,9,7等)。我是一个Python新手。我究竟做错了什么?谢谢!
答案 0 :(得分:1)
line = "[11, (28, 33, 45, 55, 62, 66)]"
from ast import literal_eval
print literal_eval(line)[0]
11
代码中的 line[0]
为[
,line[1]
为1
等。这就是您获取单个字符的原因。
literal_eval会将您的行转换为实际的list
,然后您可以像对待任何列表一样对其进行索引,以访问您需要的任何元素。
您还可以使用re
搜索\d+
一个或多个连续数字:
line = r"[11, (28, 33, 45, 55, 62, 66)]"
import re
print re.findall("\d+",line)[0]
11
第三个选项使用lstrip
和split
:
line = "[11, (28, 33, 45, 55, 62, 66)]"
print line.lstrip("[").split(",")[0]
11
lstrip("[")
删除[
,我们然后{\}}删除逗号并获取第一个元素。
答案 1 :(得分:0)
现在,每一行都被简单地视为一个字符串,因此,你正在查看每一行的第二个字符(记住第一个字符是0),它只给出第一个数字的第一个数字。
您需要做的是将每一行评估为元素列表而不是字符串,然后第0个元素将是' 11'' 10'等等。
答案 2 :(得分:0)
由于输入文件中的数据格式,我发现Padraic使用eval的答案非常简单明了,但如果你想使用正则表达式:
import re
f = open('test.txt')
for line in iter(f):
print re.match("\[(\d*)", line).group(1)
for refrence:Python re
doc:https://docs.python.org/2/library/re.html