在运行一个小脚本时,脚本从一文本文件读取数据,事实上这个文件只有一行‘count:2‘,并取到这个2,将其转成数字。但运行,总是报错。
代码如下:
1 with open(‘count.txt‘, ‘r‘) as file: 2 if not file.readline(): 3 pass 4 else: 5 name, count = file.readline().split(‘:‘) 6 count = int(count)
code
错误信息如下:
‘‘‘
Traceback (most recent call last):
File "C:\Users\Andy\Desktop\split_error.py", line 6, in <module>
count = int(count)
#ValueError: invalid literal for int() with base 10: ‘‘
‘‘‘
由此可以看出count为空。但是明显有内容,怎么会是空呢?于是注释到count = int(count)这行,再次运行,又出错了
错误信息如下:
‘‘‘
Traceback (most recent call last):
File "C:\Users\Andy\Desktop\split_error.py", line 5, in <module>
name, count = file.readline().split(‘:‘)
ValueError: not enough values to unpack (expected 2, got 1)
‘‘‘
说是没有给足够的值来解包,应该有两个,只给了一个。这就奇怪了,还是不明白原因。
于是shell里面试了下,终于找到原因:
当打开文件时,比如对一个文件执行了:readlines() 或者 readline() 那么文件的当前位置偏移就会改变,readlines()是偏移到文件结尾,而readlin()偏移到下一行.
(本脚本是因为执行if时,已经执行了readlines(),不成立,又执行else中的readlin())
所以,当这里第二次调用readlines()或者readlin()时,
已经到了文件结尾,读取到的内容为空,所以对空内容取split(‘:‘)方法时,当然报错。
因此,这里的最好的解决方法就是在第一次读之前将文件偏移回文件头
方法如下:file.seek(0)
再次读取,一切正常!