安迪_963

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

在运行一个小脚本时,脚本从一文本文件读取数据,事实上这个文件只有一行'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)

再次读取,一切正常!

 

posted on 2016-03-26 13:35  Andy_963  阅读(10936)  评论(0编辑  收藏  举报