Python 如何用numpy数组替换部分文件

Python 如何用numpy数组替换部分文件,python,numpy,Python,Numpy,我有一个.msh文件,可以由文本阅读器打开和修改。我想用python打开它,然后用numpy数组替换一些特定的行,并将其另存为一个新的.msh文件。我的numpy数组有9列和数百行。我的文件也有数百行。我想用numpy数组替换文件中有9列的行。当然,numpy数组中的行数与文件中有9列的行数相同。为了简单起见,我在这里只显示了两行,但实际上我有数百行。 numpy阵列是: arr_1= np.array([[1, 2, 3, 4, 5, 6, 7, 8, 9],

我有一个.msh文件,可以由文本阅读器打开和修改。我想用python打开它,然后用numpy数组替换一些特定的行,并将其另存为一个新的.msh文件。我的numpy数组有9列和数百行。我的文件也有数百行。我想用numpy数组替换文件中有9列的行。当然,numpy数组中的行数与文件中有9列的行数相同。为了简单起见,我在这里只显示了两行,但实际上我有数百行。 numpy阵列是:

arr_1= np.array([[1, 2, 3, 4, 5, 6, 7, 8, 9],
                 [-1, 0, 0, 1, 46, 2, -11, 0, 0]])
我的文件(my_文件)如下所示:

$MeshFormat
2.2 0 8
$EndMeshFormat
$Nodes
2929
1 26.66002035140991 0.75 1.25
-1 5 14 13.2 7.4444 11 9 -3 0.15 
0.2 9 54.45 1 63 22.45 0 12 425.65
with open('my_file') as f:
    for line in f:
        new_data = line.split()
        if len(new_data)==9:
            for i in new_data:
                for j in arr_1:
                    i = j
然后,我想获得一个新保存的文件,其新名称如下:

$MeshFormat
2.2 0 8
$EndMeshFormat
$Nodes
2929
1 26.66002035140991 0.75 1.25
1 2 3 4 5 6 7 8 9 
-1 0 0 1 46 2 -11 0 0
我只能做到以下几点,但它不起作用:

with open('my_file') as f:
   new_data= line.split() for line in f if len(line.split()) == 9
   for i in new_data:
        for j in arr_1:
             i = j
我试过了,但一点也不成功。所以,我很感激任何暗示和帮助。 干杯 阿里

尝试以下方法:

$MeshFormat
2.2 0 8
$EndMeshFormat
$Nodes
2929
1 26.66002035140991 0.75 1.25
-1 5 14 13.2 7.4444 11 9 -3 0.15 
0.2 9 54.45 1 63 22.45 0 12 425.65
with open('my_file') as f:
    for line in f:
        new_data = line.split()
        if len(new_data)==9:
            for i in new_data:
                for j in arr_1:
                    i = j
请尝试以下操作:

$MeshFormat
2.2 0 8
$EndMeshFormat
$Nodes
2929
1 26.66002035140991 0.75 1.25
-1 5 14 13.2 7.4444 11 9 -3 0.15 
0.2 9 54.45 1 63 22.45 0 12 425.65
with open('my_file') as f:
    for line in f:
        new_data = line.split()
        if len(new_data)==9:
            for i in new_data:
                for j in arr_1:
                    i = j

您可以尝试此代码,其中将写入名为
changed
的新文件。为了减少磁盘写入(以提高性能,特别是对于大型文件),将向新文件写入大量行

chunk_size = 3
buffer = ""
i = 0
# the index of lines with 9 digits 
relavent_line = 0

with open('changed', 'a') as fout:
    with open('original', 'r') as fin:
        
        for line in fin:
            
            if len(line.split()) == 9:
                aux_string = ' '.join([str(num) for num in arr_1[relavent_line]])
                buffer += '%s\n' % aux_string
                relavent_line += 1
            else:
                buffer += line 
                
            i+=1
            if i == chunk_size:
                fout.write(buffer)
                i=0
                buffer = ""
              
    # make sure all lines will be written to the output file   
    if buffer:
        fout.write(buffer)
        i=0
        buffer = ""

您可以尝试此代码,其中将写入名为
changed
的新文件。为了减少磁盘写入(以提高性能,特别是对于大型文件),将向新文件写入大量行

chunk_size = 3
buffer = ""
i = 0
# the index of lines with 9 digits 
relavent_line = 0

with open('changed', 'a') as fout:
    with open('original', 'r') as fin:
        
        for line in fin:
            
            if len(line.split()) == 9:
                aux_string = ' '.join([str(num) for num in arr_1[relavent_line]])
                buffer += '%s\n' % aux_string
                relavent_line += 1
            else:
                buffer += line 
                
            i+=1
            if i == chunk_size:
                fout.write(buffer)
                i=0
                buffer = ""
              
    # make sure all lines will be written to the output file   
    if buffer:
        fout.write(buffer)
        i=0
        buffer = ""

欢迎来到SO!请注意,添加一些解释通常可以改进答案。亲爱的@Mobi1968,我非常感谢您的解决方案。你知道我如何保存一个新文件吗?现在,它只运行一些for和if循环。事实上,我想将其另存为一个新的.msh文件。同时,我感谢任何更有效的解决方案。正如我所说,我的真实数据有数百行,甚至数千行,例如,我花了11分钟28秒来运行我的真实数据。欢迎使用SO!请注意,添加一些解释通常可以改进答案。亲爱的@Mobi1968,我非常感谢您的解决方案。你知道我如何保存一个新文件吗?现在,它只运行一些for和if循环。事实上,我想将其另存为一个新的.msh文件。同时,我感谢任何更有效的解决方案。正如我所说,我的真实数据有数百行,甚至数千行,例如,我花了11分钟28秒来运行我的真实数据。亲爱的@meTchaikovsky,你的解决方案太棒了。这正是我要找的。请注意,有没有办法嵌入for循环?比如说,我有一系列原始文件和一系列arr_1。我如何为他们制作一系列更改过的文件?亲爱的@meTchaikovsky,你的解决方案太棒了。这正是我要找的。请注意,有没有办法嵌入for循环?比如说,我有一系列原始文件和一系列arr_1。如何为他们制作一系列已更改的文件?