[英]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.