простой питон для цикла не обновляет элемент - PullRequest
0 голосов
/ 31 мая 2019

Я впервые пробую что-либо в python, и я даже не могу получить цикл for для обновления элемента.Пожалуйста, что я не вижу?

У меня есть эти данные в текстовом файле

Y | Содержание / MacOS / Safari | 1500
N | Содержание / MacOS / firefox | 1200
Y | Содержание/ MacOS / Evernote | 1100

И я хочу изменить N во второй строке на Y. Он печатает форму, которую я хочу внутри цикла, но не снаружи?Что это?

def setTrackable(self,appName):
        lookfor = 'Contents/MacOS/'+appName
        with open (self.__dataFile,"r") as myfile:
            data = myfile.readlines()

        for line in data:
            temp = line.split("|")
            if (temp[1] == lookfor):
                line = 'Y|'+lookfor+"|"+temp[2]
                print("line: "+line)

        print (data[1])
        with open (self.__dataFile, "w") as myfile:
            myfile.writelines(data)

Ответы [ 4 ]

2 голосов
/ 31 мая 2019

Вы никогда ничего не делаете для обновления значений в data; все, что вам нужно сделать, это определить новую переменную с именем line, распечатать ее, а затем отбросить Вы должны добавить это новое значение в список.

Более Pythonic реализация будет:

with open (self.__dataFile,"r") as myfile:
    data = []

    for line in myfile:
        temp = line.split("|")
        if temp[1] == lookfor:
            line = 'Y|'+lookfor+"|"+temp[2]
            print("line: "+line)
        data.append(line)
1 голос
/ 31 мая 2019

Короче больше Питонический способ с использованием регулярного выражения:

with open(self.__dataFile,"r") as myfile1, open(self.__dataFile, "w") as myfile2:
    for line in myfile1:
        myfile2.write(re.sub(f'^N(|{lookfor}|\d+)', 'Y\\1', line))

Как обсуждалось в комментариях и других ответах, line - это просто локальная переменная, область действия которой является локальной и неизменить оригинал data.

Обратите внимание, пожалуйста, не забудьте импортировать re.

1 голос
/ 31 мая 2019

Используйте перечисление и измените data соответственно:

for i, line in enumerate(data):
    temp = line.split("|")
    if (temp[1] == lookfor):
        line = '|'.join(['Y', lookfor, temp[2]]) 
        data[i] = line
        print("line: "+line)
1 голос
/ 31 мая 2019

Вот пример кода для получения желаемых результатов, не обращайте внимания на мое использование StringIO, так как я читаю ваш файл из памяти, в противном случае вы можете использовать модуль csv для простого анализа этих данных.

import csv
from io import StringIO

s = """Y|Contents/MacOS/Safari|1500
N|Contents/MacOS/firefox|1200
Y|Contents/MacOS/Evernote|1100"""

fin = StringIO(s)

def parser(file_obj):
    reader = csv.reader(file_obj, delimiter='|')
    data = []
    for line in reader:
        if line[0] == 'N':
            line[0] = 'Y'
        data.append(line)
    return data

p = parser(fin)

print(p)

[['Y', 'Contents/MacOS/Safari', '1500'],
 ['Y', 'Contents/MacOS/firefox', '1200'],
 ['Y', 'Contents/MacOS/Evernote', '1100']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...