python - 搜索和替换
问题描述
我想逐行解析文件并用另一个标点符号替换固定标点符号(例如句点“/”和斜杠“。”)只有当该行中的字符串包含某个变量时
示例:仅当字符串包含 Fx 时才替换
line1: test1/test2
line2: .test + e/y + Fx/var1/var2
输出:
line1: test1/test2
line2: .test + e/y + Fx.var1.var2
我该怎么做呢?到目前为止的代码,但我知道它不起作用
import os
textToFind = '/'
textToReplace = '.'
sourcepath = os.listdir('InputFiles/')
def lines_that_contain(string, fp):
return [line for line in fp if string in line]
for file in sourcepath:
inputFile = 'InputFiles/'+ file
print('Conversion is ongoing for:' +inputFile)
with open(inputFile, 'r') as inputFile:
for line in lines_that_contain("Fx.", inputFile):
print('found Fx.')
fileData = fileData.replace(textToFind, textToReplace)
freq2 = 0
freq2 = fileData.count(textToFind)
destinationPath = 'OutputFile/' + file
with open(destinationPath, 'w') as file:
file.write(fileData)
print ('Total %d Record Replaced' %freq2)
else:
print('Did not find selected strings')
解决方案
您的代码存在多个问题:
fileData
在设置之前使用。- 您的循环仅在包含“触发器”字符串的行上运行,因此您将无法输出未修改的其他行。
- 如果
fileData
应该包含到目前为止读取的所有数据,则替换将影响每一行,无论它是否包含触发器。 - 输出可能是“Total 0 Record Replaced”,然后是“Did not find selected strings”:您正在计算要替换的文本在替换后的出现次数。而且由于您的循环不包含
break
语句,因此将对 else 子句进行评估。 - 您正在为读取的每一行重新创建和写入输出文件。
要解决这些问题,请收集列表中的所有行,如果它们包含触发器,则对其进行修改。读取整个文件后,打开输出文件并转储您收集的行。
import os
textToFind = '/'
textToReplace = '.'
trigger = "Fx."
sourcepath = os.listdir('InputFiles/')
for file in sourcepath:
inputFile = 'InputFiles/'+ file
print('Conversion is ongoing for:' + inputFile)
with open(inputFile, 'r') as infile:
fileData = []
replacements = 0
for line in infile:
if trigger in line:
fileData.append(line.replace(textToFind, textToReplace))
replacements += 1
else:
fileData.append(line)
destinationPath = 'OutputFile/' + file
with open(destinationPath, 'w') as outfile:
# The lines already contain terminating \n characters.
outfile.write(''.join(fileData))
if replacements > 0:
print('Total %d Record Replaced' % replacements)
else:
print('Did not find selected strings')
由于每一行都是独立处理的,因此您还可以实现一个流式版本,首先打开输入和输出文件,然后一次读取、处理和写入一行。这就是sed
程序所做的——sed '/Fx\./ s#/#.#g' inputFile > outputFile
在 shell 中调用对单个文件执行相同的任务。
推荐阅读
- php - 在 $lookup MONGO 上提高 $match 的速度
- java - 当我尝试从方法访问私有变量时,为什么我的私有变量变为空?
- swift - NSDecimalNumber(x).intValue 返回 -2、0、15 和 199,具体取决于 x 中的小数位数 (x = 199.999...5)
- webpack - webpack-dev-server writeToDisk: true
- scala - 如何将两个列表组合成二维列表
- python - 如何理解三体问题中的语法错误?
- python - 这两个规范等效的 Python 代码
- javascript - 复选框更改颜色按钮后
- microsoft-teams - 在 MS Teams 中设置私有选项卡
- html - 什么是在反应?