Найдите символ в текстовом файле с разделителями-запятыми и верните строку, к которой он принадлежит - PullRequest
1 голос
/ 25 марта 2019

У меня есть несколько текстовых файлов с разделителями-запятыми, которые я хотел бы прочитать, найти расположение специального символа «X» и вернуть «Z» в той же строке, где он принадлежит, в строковых типах.Текстовый файл выглядит следующим образом:

"a1", "a2", "a3"
"b1", "b2", "b3"
"c1", "c2", "c3"
...
"X", "Y", "Z"
...
"n1", "n2", "n3"

Количество строк, в которых отображается «X», зависит от файла.Поэтому я хотел бы написать функцию, которая может применяться ко всем файлам, возвращая «Z» в виде строки.

Я пробовал следующий код:

from itertools import islice
def _function():
    z = [0,0,0]
    f = open(file, 'r')
    num = sum(1 for line in f)
    for i in islice(f, 0, num):
        x = f.readline()
        y = x.find('X')
        if y == -1:
            pass
        else:
            z = f.readline().rstrip().split(',')
    return z[2]

Однако, когда я запускаюкод, я получаю 0 в качестве результата, что означает, что код не зацикливается.Я также обнаружил, что когда я использую f = open(file), он длится только одну строку кода.

Моя текущая версия - Python 3.7 на Anaconda.Спасибо!

1 Ответ

1 голос
/ 25 марта 2019

Выпуск 1:

В случае y == -1 вы не указали никакого значения для z (нигде, кроме этого), только в случае else.

Итак, что будет возвращено при получении z[2] при y == -1?

По сути, вам нужно установить заполнитель значение для z для этого случая или до этого. Лучшим местом для заполнителя было бы установить его перед циклом for, чтобы вам не приходилось выполнять привязку имени на каждой итерации.

Выпуск 2:

Вы уже исчерпали файловый объект итератор , считая строки:

num = sum(1 for line in f)

Поэтому, когда вы делаете f.readline() в следующем цикле, он всегда будет возвращать пустую строку.

Простым исправлением было бы seek назад к началу файла:

f.seek(0)

после числа и перед входом в цикл.

Но это все еще не Pythonic , лучшим способом было бы перебирать строки файла (поскольку файловые объекты являются итераторами), используя цикл for, и вы работаете:

for line in f:
    y = line.find('X')
    ...
    ...  

И, конечно же, поскольку open является менеджером контекста, используйте его для автоматической обработки правильной close -информации файла:

with open('file.txt') as f:
    for line in f:
        # Do stuffs

(Не вдавайтесь в ваш алгоритм, так как это было бы вопросом для проверки кода.)

...