我不知道为什么我的读取文件循环正在跳过行。
我正在尝试在python中编写一个简单的程序来解析txt文档,然后再在另一个文档中运行它。我本质上有一个文本文件,看起来像一个三角形,我试图解析成列表中的列表,即。
1
2 3
4 5 6
7 8 9 10
到
[[1],[2,3],[4,5,6],[7,8,9,10]]
但是,在我的下面的代码中,我的while循环看起来像是“跳过”其他所有行,所以我得到类似[[2,3],[7,8,9,10]]
的内容而不是上面的列表。更令人费解的是,如果我注释掉最后一行,while循环将打印'1'完全正确的次数
f = open('test.txt')
triangle = []
while f.readline() != '':
print 1
triangle.append(map(int,f.readline().strip().split()))
答案 0 :(得分:11)
每次拨打f.readline()
时,都会读到一行。因为你在循环中调用f.readline()
,所以你正在循环中读取一个额外的行。做你想做的更简单的方法是直接在文件上迭代:
for line in f:
# do whatever you want with the line.
答案 1 :(得分:3)
如果您只是在文件顶部添加一个空行,则您的示例会生成[[], [], [], []]
[[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]
也可以试试这个:
triangle = [ [int(value) for value in line.split(' ') if value.strip()]
for line in open('test.txt') if line.strip()]
list comprehenssions 可以比标准循环更快。测试它,它工作,这个代码也可以工作,无论空行,它更安全,假设你的所有条目都是整数。
显然不是每个人都喜欢LC所以:
triangle = []
with open('test.txt', 'r') as f:
for index, line in enumerate(f):
if line.strip():
value = []
for number in line.split(' '):
if number.strip():
try:
value.append(int(number))
except Exception as ex:
print 'Failed to convert %s at line %i' % (number, index)
print 'Exception %s' % str(ex)
raise ex
triangle.append(value)
print triangle
生成[[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]
现在有些人可能喜欢LC,有些人可能喜欢循环标准,这完全是意见/品味问题,尽管是的,for循环那些try ... except ...
有点好,因为它可以告诉你哪个线路失败,但我再次提到只要所有值都是整数,LC就可以了。
$ python -m timeit 'execfile("test.py")'
10000 loops, best of 3: 198 usec per loop
$ python -m timeit 'execfile("test1.py")'
10000 loops, best of 3: 130 usec per loop
所以基本上35%
改进与标准相比,再次真正取决于个人。我个人使用非常大的数据集,因此我尝试尽可能地优化它。
答案 2 :(得分:1)
with open('data1.txt') as f:
lis=[map(int,x.split()) for x in f if x.strip()]
print(lis)
[[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]
<强>解释强>
使用for x in f
逐行阅读文件,并跳过那些在应用strip()
后其值等于False
或''
的行。
然后使用map()
和split()
创建int
列表。