在Python中用新行替换行
我正在读取一个文本文件,并根据某些条件逐行搜索数据,更改行中的某些值,然后将其写回另一个文件。新文件不应包含旧行。我试过以下方法,但不起作用。我想我错过了一件非常基本的事情在Python中用新行替换行,python,Python,我正在读取一个文本文件,并根据某些条件逐行搜索数据,更改行中的某些值,然后将其写回另一个文件。新文件不应包含旧行。我试过以下方法,但不起作用。我想我错过了一件非常基本的事情 解决方案:在C++中,我们可以增加行,但在Python中,我不知道如何实现这一点。所以到现在为止,我写的是旧的一行而不是新的一行。但在新文件中,我只需要新行 例如: M0 38 A 19 40 DATA2 L=4e-08 W=3e-07 nf=1 m=1 $X=170 $Y=140 $D=8 M0 VBN A 19 40 T
解决方案:在C++中,我们可以增加行,但在Python中,我不知道如何实现这一点。所以到现在为止,我写的是旧的一行而不是新的一行。但在新文件中,我只需要新行
例如:M0 38 A 19 40 DATA2 L=4e-08 W=3e-07 nf=1 m=1 $X=170 $Y=140 $D=8
M0 VBN A 19 40 TEMP2 L=4e-08 W=3e-07 nf=1 m=1 $X=170 $Y=140 $D=8
我尝试的代码如下所示:
def parsefile():
fp = open("File1", "rb+")
update_file = "File1" + "_update"
fp_latest = open(update_file, "wb+")
for line in fp:
if line.find("DATA1") == -1:
fp_latest.write(line)
if line.find("DATA1") != -1:
line = line.split()
pin_name = find_pin_order(line[1])
update_line = "DATA " + line[1] + " " + pin_name
fp_latest.write(update_line)
line = ''.join(line)
if line.find("DATA2") != -1:
line_data = line.split()
line_data[1] = "TEMP2"
line_data =' '.join(line_data)
fp_latest.write(line_data)
if line.find("DATA3") != -1:
line_data = line.split()
line_data[1] = "TEMP3"
line_data =' '.join(line_data)
fp_latest.write(line_data)
fp_latest.close()
fp.close()
当前代码的主要问题是第一个
if
块,当出现“DATA2”
或“DATA3”
时,该块会检查“DATA1”
,如果找不到,则将该行写出。由于它们有自己的块,因此最终会以两种不同的形式复制该行
下面是对循环的一个最小修改,它应该可以工作:
for line in fp:
if line.find("DATA1") != -1:
data = line.split()
pin_name = find_pin_order(data[1])
line = "DATA " + data[1] + " " + pin_name
if line.find("DATA2") != -1:
data = line.split()
data[1] = "TEMP2"
line =' '.join(data)
if line.find("DATA3") != -1:
data = line.split()
data[1] = "TEMP3"
line =' '.join(data)
fp_latest.write(line)
这确保只写入一行,因为代码中只有一个write()
调用。特殊情况只是修改要写入的行。我不确定我是否理解您希望在这些情况下进行的修改,因此可能会有更多的bug
一件可能有用的事情是将第二个和第三个
if
语句改为elif
语句。这将确保只运行其中一行(尽管如果您知道您的文件在一行上永远不会有多个数据
条目,这可能是不必要的)。如果您想在文件中写入新行以替换上次读取的旧内容,可以使用file.seek()方法在文件周围移动,有一个例子
with open("myFile.txt", "r+") as f:
offset = 0
lines = f.readlines()
for oldLine in lines:
... calculate the new line value ...
f.seek(offset)
f.write(newLine)
offset += len(newLine)
f.seek(offset)
值得注意的是,在Python中处理文件时,最好使用。同样,如果要检查某个内容不在字符串中,最好的方法是在第行中使用
if not“string”,而不是使用line.find()
:。这里也有复制/粘贴编码的症状-您多次使用稍微不同的变量执行相同的操作-您应该将该功能提取到循环和/或函数中。if line.find(“DAT1”)!=-1:
-你的意思是“DAT1”而不是“DATA1”吗?为什么不直接使用else:
呢?您想要什么输出?当前,如果输入行中同时出现DATA1
和DATA2
,则输出文件将写入两行。你打算这么做吗?