簡體   English   中英

使用正則表達式更改文件python中的多行

[英]change multiple lines in file python using 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         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

values.csv

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

鏈接: ideone示例

如果我正確理解了您想要的內容,那么下面的代碼將保留行的格式:

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  """

import re,csv

pat = '^([ \t]*[-+]?(?:\d+\.?|\.?\d)[\deE+-]*)'\
      '([ \t]+[-+]?(?:\d+\.?|\.?\d)[\deE+-]*)'\
      '([ \t]+[-+]?(?:\d+\.?|\.?\d)[\deE+-]*)'\
      '([ \t]+[-+]?(?:\d+\.?|\.?\d)[\deE+-]*)'\
      '([ \t]*(?:[-+]?(?:\d+\.?|\.?\d)[\deE+-]*[ \t]*)*\n'\
      \
      '^[ \t]*(?:[-+]?(?:\d+\.?|\.?\d)[\deE+-]*[ \t]*)+\n'\
      \
      '^[ \t]*(?:[-+]?(?:\d+\.?|\.?\d)[\deE+-]*[ \t]*)+)$'
r = re.compile(pat,re.MULTILINE) 

def modify(text,filepath,r = r):
    with open(filepath,'rb') as vava:
        VALUES = map(tuple,
                     csv.reader(vava, delimiter='\t', skipinitialspace=True))

    dic = {}
    def ripl(m,VALUES=VALUES,dic=dic):
        lens = tuple(len(x) for x in m.group(2,3,4))
        pat = dic.setdefault(lens,'%%%ds%%%ds%%%ds' % lens)
        return m.group(1) + pat % VALUES.pop(0) + m.group(5)

    return r.sub(ripl,text)

print modify(text,'values.csv')

結果

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獲得相應的模式,如果不是,則創建新模式並將其放入字典中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM