Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中用新行替换行_Python - Fatal编程技术网

在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
,则输出文件将写入两行。你打算这么做吗?