我正在读取文本文件并逐行搜索数据,基于某些条件,更改行中的某些值并将其写回另一个文件。新文件不应包含旧行。我尝试了以下,但它没有奏效。我想我错过了一件非常基本的事情。
解决方案:在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()
答案 0 :(得分:1)
您当前代码的主要问题是,您的第一个if
块会检查"DATA1"
并在未找到时将其写出来"DATA2"
或{{1 }} 存在。由于它们有自己的块,因此该行最终会以两种不同的形式复制。
以下是对循环的最小修改:
"DATA3"
这确保只写一行,因为代码中只有一个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()
语句改为if
语句。这将确保只运行其中一个(尽管如果您知道您的文件在一行上永远不会有多个elif
条目,则可能没有必要)。
答案 1 :(得分:1)
如果你想在一个文件中写一个新行来替换上次已经被重新加入的旧内容,你可以使用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)