使用正则表达式更改python文件中的多行
我有下面的文本文件和重复的数据块。我只想更改每个数据块中的值A、B、C,并将更新后的数据块写入文件。在将整个文件加载到字符串中之后,如何使用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
*** 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的用户。