我第一次尝试在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)
答案 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
。