如何在python中将文件行转换为float / int

时间:2011-11-01 23:46:37

标签: python file python-2.7 ioerror

每当我尝试运行此代码时:

    #Open file
    f = open("i.txt", "r")
    line = 1

    #Detect start point
    def findstart( x ):
        length = 0
        epsilon = 7
        a = 3
        line_value = int(f.readline(x))
        if line_value == a:
            length = length + 1
            x = x + 1
            findend(x)
        elif line_value == epsilon:
            x = x + 2
            findstart(x)
        else:
            x = x + 1
            findstart(x)

    #Detect end point
    def findend(x):
        line_value = int(f.readline(x))
        if line_value == a:
            length = length + 1
            return ("Accept", length)
        elif line_value == epsilon:
            x = x + 2
            length = length + 2
            findend(x)
        else:
            x = x + 1
            length = length + 1
            findend(x)

    findstart(line)

我收到此错误代码:

    Traceback (most recent call last):
  File "C:\Users\Brandon\Desktop\DetectSequences.py", line 39, in <module>
    findstart(line)
  File "C:\Users\Brandon\Desktop\DetectSequences.py", line 16, in findstart
    findend(x)
  File "C:\Users\Brandon\Desktop\DetectSequences.py", line 26, in findend
    line_value = int(f.readline(x))
    ValueError: invalid literal for int() with base 10: ''

任何人都可以帮我弄清楚出了什么问题吗?在我看来,它试图读取一个空单元格,但我不知道为什么会这样。我正在扫描的文件目前只有两行,每行读数为“3”,因此它应该输出成功,但我无法通过此错误。

3 个答案:

答案 0 :(得分:1)

你正在读一个空白行,而python不喜欢这样。你可能应该检查空白行。

line_value = f.readline(x).strip()
if len(line_value) > 0:
    line_value = int(line_value)
    ...

答案 1 :(得分:1)

我不确定您的代码,但错误消息表明您的文件中有一个空行,并且您尝试将其转换为int。例如,很多文本文件末尾都有一个空行。

我建议您在转换前先检查一下你的行:

line = ...
line = line.strip() # strip whitespace
if line: # only go on if the line was not blank
    line_value = int(line)

答案 2 :(得分:1)

变量a,length和epsilon存在范围问题。您可以在findstart中定义它,但尝试在findend中访问它。

此外,传递给readline的变量x没有按照您的想法进行。 Readline总是返回文件中的下一行,传递给它的变量是行的长度可选的暗示,它不是应该读取的行。要在特定行上操作,请先将整个文件读入列表:

# Read lines from file
with open("i.txt", "r") as f:
    # Read lines and remove newline at the end of each line
    lines = [l.strip() for l in f.readlines()]

    # Remove the blank lines
    lines = filter(lambda l: l, lines)

EPSILON = 7
A = 3
length = 0

#Detect start point
def findstart( x ):
    global length

    length = 0

    line_value = int(lines[x])
    if line_value == A:
        length += 1
        x += 1
        findend(x)
    elif line_value == EPSILON:
        x += 2
        findstart(x)
    else:
        x += 1
        findstart(x)

#Detect end point
def findend(x):
    global length

    line_value = int(lines[x])
    if line_value == A:
        length += 1
        return ("Accept", length)
    elif line_value == EPSILON:
        x += 2
        length += 2
        findend(x)
    else:
        x += 1
        length += 1
        findend(x)

findstart(0)