简单的python for循环不会更新元素

时间:2019-05-31 17:26:14

标签: python for-loop

我第一次尝试在python中进行任何操作,我什至无法获得for循环来更新元素。拜托,我没看到什么?

我将这些数据保存在文本文件中

  

Y | Contents / MacOS / Safari | 1500
   N | Contents / MacOS / firefox | 1200
  Y | Contents / 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 个答案:

答案 0 :(得分:2)

您从不做任何事情来更新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 :(得分:1)

这是一个产生所需结果的代码示例,请不要理会我对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']]

答案 2 :(得分:1)

使用枚举并相应地修改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)

答案 3 :(得分:1)

使用正则表达式的更多更短的pythonic方式:

const allUsers = () => Promise.resolve([{ name: 'Bruno' }])

function App() {
  const { data } = useFetch(allUsers, [], { now: true })
  console.log('->', data)
  return (
    <span>Testing hook</span>
  )
}

如评论和其他答案中所述,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