使用正则表达式更改python文件中的多行

使用正则表达式更改python文件中的多行,python,regex,Python,Regex,我有下面的文本文件和重复的数据块。我只想更改每个数据块中的值A、B、C,并将更新后的数据块写入文件。在将整个文件加载到字符串中之后,如何使用python结构实现这一点 *** DATA 1 253.31 78.20 490.0 0 0 1 0 0 101 0 0 0 0 0 0 1 2

我有下面的文本文件和重复的数据块。我只想更改每个数据块中的值A、B、C,并将更新后的数据块写入文件。在将整个文件加载到字符串中之后,如何使用python结构实现这一点

***   DATA
     1    253.31     78.20     490.0         0 0 1 0 0
   101         0         0         0         0         0         0          
     1         2         3         4         5         6
     2    123.31   -122.20     -20.0         0 0 1 0 0
   101         0         0         0         0         0         0          
     7         8         9        10        11        12
     3     53.21      10.2      90.0         0 0 1 0 0
   101         0         0         0         0         0         0          
    13        14        15        11        10        10
     .
     .
     .
    10         A         B         C         0 0 1 0 0
   110         0         0         0         0         0         0          
    20        21        22        23        24        25

我认为这段代码可能会满足您的要求

import csv

with open('my_data.csv') as data_file,\
     open('values.csv') as value_file, \
     open('my_new_data.csv', 'wb') as out_file:

    data_reader = csv.reader(data_file, delimiter=' ', skipinitialspace=True)
    value_reader = csv.reader(value_file, delimiter=',')
    writer = csv.writer(out_file, delimiter=' ')
    while True:
        try:
            row = next(data_reader)
            row[1:4] = next(value_reader)
            writer.writerows([row, next(data_reader), next(data_reader)])
        except StopIteration:
            break
如果这是输入文件:

my_data.csv

 1    253.31     78.20     490.0         0 0 1 0 0
   101         0         0         0         0         0         0          
     1         2         3         4         5         6
     2    123.31   -122.20     -20.0         0 0 1 0 0
   101         0         0         0         0         0         0          
     7         8         9        10        11        12
     3     53.21      10.2      90.0         0 0 1 0 0
   101         0         0         0         0         0         0          
    13        14        15        11        10        10
1.0,2.5,3.2
4.1,5.2,6.2
7.6,8.0,9.3
values.csv

 1    253.31     78.20     490.0         0 0 1 0 0
   101         0         0         0         0         0         0          
     1         2         3         4         5         6
     2    123.31   -122.20     -20.0         0 0 1 0 0
   101         0         0         0         0         0         0          
     7         8         9        10        11        12
     3     53.21      10.2      90.0         0 0 1 0 0
   101         0         0         0         0         0         0          
    13        14        15        11        10        10
1.0,2.5,3.2
4.1,5.2,6.2
7.6,8.0,9.3
输出

1 1.0 2.5 3.2 0 0 1 0 0
101 0 0 0 0 0 0 
1 2 3 4 5 6
2 4.1 5.2 6.2 0 0 1 0 0
101 0 0 0 0 0 0 
7 8 9 10 11 12
3 7.6 8.0 9.3 0 0 1 0 0
101 0 0 0 0 0 0 
13 14 15 11 10 10

请注意,前导空格和尾随空格已消失。

您可以使用
str.replace

with open('data.txt', 'r') as f:
    data = f.read()

A = str(30.4)
B = str(60000)
C = str(9)

data = data.replace('A'.rjust(len(A)), A) # eg, replace '   A' with '30.4'
data = data.replace('B'.rjust(len(B)), B)
data = data.replace('C'.rjust(len(C)), C)

with open('out.txt', 'w') as f:
    f.write(data)
    f.close()

这就是你想做的吗

import re

data = """***   DATA
     1    253.31     78.20     490.0         0 0 1 0 0
   101         0         0         0         0         0         0          
     1         2         3         4         5         6
     .
     .
     .
     .
    10         A         B         C         0 0 1 0 0
   110         0         0         0         0         0         0          
    20        21        22        23        24        25"""
mldata = data.split('\n')

regex = re.compile(r'\b([A-Za-z])\b')
replacement = "test"

for line in mldata:
    newline = re.sub(regex,replacement,line)
    print newline

链接:

如果我正确理解了您想要的内容,下面是一个保留行格式的代码:

text = """DATA gfghsg hsghghsfghsfghshsdhf
     1    253.31     78.20     490.0         0 0 1 0 0
   101        .0         0         0         0         0         0          
     1         2         3         4         5         6
     2    123.31   122.20     -20.0         0  0  1  0  0
   201         0         0         0         0         0         0          
     7         8         9        10        11        12
     6         6         .        66       666      4 8 7 4 5 7
     3     53.21      10.2      90.0e+15         0 0 1 0 0
   301         0         0         0         0         0         0          
    13        14        15        11        10        10
kjqbskjqskdkqsdbkjqsbd
   547      AFFO       457       6545   1 0 2 5 4
    10        44       138          -.017         0 0 1 0 0
   410         0         0         0         0         0         0          
    20        21        22        23        24        25
  8888      9999
   500       87E-458      12  .4
   1.2     4.E-56     
    12   45  """

结果

DATA gfghsg hsghghsfghsfghshsdhf
     1    100000      0.01    101.01         0 0 1 0 0
   101        .0         0         0         0         0         0          
     1         2         3         4         5         6
     2         2     0.02     20022         0  0  1  0  0
   201         0         0         0         0         0         0          
     7         8         9        10        11        12
     6         6         .        66       666      4 8 7 4 5 7
     3      3303     0.033       3.03333         0 0 1 0 0
   301         0         0         0         0         0         0          
    13        14        15        11        10        10
kjqbskjqskdkqsdbkjqsbd
   547      AFFO       457       6545   1 0 2 5 4
    10       4.4      0.44            4.4         0 0 1 0 0
   410         0         0         0         0         0         0          
    20        21        22        23        24        25
  8888      9999
   500          5555 0.5555555e+55
   1.2     4.E-56     
    12   45
第三部分

lens = tuple(len(x) for x in m.group(2,3,4))
pat = dic.setdefault(lens,'%%%ds%%%ds%%%ds' % lens)

是一种复杂的设计,它考虑了所有修改行的格式不总是相同的可能性。因此,它检查包含4个第一个值的行的4个前部分的长度:如果这些值已经已知,则从字典
dic
中获取相应的模式,如果没有,则创建新模式并将其放入字典中。

这里的分隔符是什么?空间?标签?一致吗?数据之间只有空格!一致的你是说格式化?是的,它是格式化的。。。如果你想知道这个。是一个值还是五个值?是五个值。。。但我不在乎他们。我会照原样把它们复制到新行。我只关心A,B,C的变化……A,B,C是字面上的那些字符,还是通常有数字?谢谢Steinar!这更接近我需要的答案,但你误解了一件事。这个数据块重复“N”次,我想改变每个数据块中A、B和C的值。不仅在一个街区!当然,块的其他值将保持不变。@TeXFun您如何知道新块正在启动/当前块已结束?我不知道此信息!只有那块是3行!因此,整个数据是(3行数据)x(N次)。在每个3行数据块中,我只想分别更改A、B、C位置的值。是的!这就是这个问题的答案!非常感谢你!干得好,斯泰纳@如果它解决了你的问题:这个解决方案的一大缺点就是你必须把整个文件读入内存。这是不必要的,如果文件足够大,可能会导致问题。在这个代码段中,只有A、B、C将被字符串测试替换。不是我想要的253.31、78.20、490.0!这也是解决我问题的有效方法。但是,我们如何更改正则表达式以便在字符串中也包含“***数据”行呢?我试图添加这一行,但结果与以前不同!是的,它在工作。但是我如何用前面的答案中提到的csv文件中的值来更改每行中所需的值呢?太棒了!再次感谢eyquem!但现在的问题是,正如您所提到的,在我们想要更改的数据块之前和之后,存在任意文本,以及数字。我找不到只匹配这些数据块的合适的正则表达式模式。我对代码进行了改进,但暂时无法完成。我以后再发然而,我想知道你所说的“在数据块之前和之后有任意的文本,还有数字”是什么意思。你的意思是说,在三行组之前不仅有头行,而且在三行组之间也有一些不稳定的行?开始打印
值的值。我打赌你会看到
不是三元组。为什么?上坡,查看
csv.reader()
作为默认参数接收的内容,并检查保存读入
值的值的文件的性质。我打赌你的文件结构和我的不同。作为开发人员,而不是stackoverflow.com的用户。