Как преобразовать строку файла в float / int в python - PullRequest
0 голосов
/ 02 ноября 2011

Всякий раз, когда я пытаюсь запустить этот код:

    #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 ]

1 голос
/ 02 ноября 2011

Я не уверен в вашем коде, но в сообщении об ошибке указывается, что в вашем файле есть пустая строка, и вы пытаетесь преобразовать его в int.Например, многие текстовые файлы имеют пустую строку в конце.

Я бы посоветовал сначала проверить вашу строку перед ее преобразованием:

line = ...
line = line.strip() # strip whitespace
if line: # only go on if the line was not blank
    line_value = int(line)
1 голос
/ 02 ноября 2011

У вас проблема с переменными a, length и epsilon.Вы определяете это в findstart, но пытаетесь получить доступ к нему в findend.

Кроме того, переменная x, передаваемая в readline, не выполняет то, что вы думаете.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)
1 голос
/ 02 ноября 2011

Вы читаете пустую строку, и python это не нравится. Возможно, вам следует проверить наличие пустых строк.

line_value = f.readline(x).strip()
if len(line_value) > 0:
    line_value = int(line_value)
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...