我正在尝试使用某些条件清理文本文件。
我的文字显示如下
NHIST_0003(ZS.MC.BGE.0424SPVCOS)(21.12)14.08
(ZS.MC.BLK.0424SPVCOS)(21.12)14.08
(ZS.MC.GRY.0424SPVCOS)(21.12)14.08
(ZS.MC.BLK.0525SPVCOS3)(21.12)14.08
(ZS.MC.GRY.0525SPVCOS2)(21.12)14.08
NHIST_0004(ZS.MC.BGE.0424SPVCOS)(21.12)14.08
我需要删除第一个"之前的任何文本("括号,如果该行之前有任何文本,并删除我想要保留的文本的括号。我还需要得到用括号里面的数字去掉。看第一行,我只想保留
ZS.MC.BGE.0424SPVC0S 14.08
这些是我试图将事情联系起来的代码。我宁愿不使用re表达式,因为在这个阶段对我来说太先进了。
fileName='reach.txt'
fileName2='outreach.txt'
while True:
f=open(fileName,'r')
for words in f:
x=words.split('(', 1)[-1]
g = open(fileName2,'w')
g.write(x)
g.close()
这个循环是无限的。我认为通过关闭文件,我告诉系统停止处理行。
答案 0 :(得分:1)
您可以循环浏览文件中的行:
with open('filename.txt') as f:
for line in f.readlines():
#do stuff
要从您想要的行中获取信息,您可以执行以下操作:
cleaned = []
items = line.split()
for item in items:
if item.startswith('(') and item.endswith(')'):
cleaned.append(item.strip('()'))
break
cleaned.append(items[-1])
cleaned = ' '.join(cleaned)
完整计划:
in_file = 'reach.txt'
out_file = 'outreach.txt'
def clean(string):
if not string:
return string
cleaned = []
items = string.split()
for item in items:
if item.startswith('(') and item.endswith(')'):
cleaned.append(item.strip('()'))
break
cleaned.append(items[-1])
return ' '.join(cleaned)
with open(in_file) as i, open(out_file, 'w') as o:
o.write('\n'.join([clean(line) for line in i]))
答案 1 :(得分:0)
fileName='reach.txt'
fileName2='outreach.txt'
def isfloat(s):
try:
float(s)
return True
except ValueError:
return False
g = open(fileName2, 'w')
with open(fileName, 'r') as fh:
for row in fh:
x = row.split()
for item in x:
if '(' in item and ')' in item:
first = item.strip('()')
break
for i in range(-1, 0-len(x), -1):
second = x[i]
if isfloat(second):
break
print(first, second)
g.write(' '.join((first, second)) + '\n')
g.close()
给出了:
ZS.MC.BGE.0424SPVCOS 14.08
ZS.MC.BLK.0424SPVCOS 14.08
ZS.MC.GRY.0424SPVCOS 14.08
ZS.MC.BLK.0525SPVCOS3 14.08
ZS.MC.GRY.0525SPVCOS2 14.08
ZS.MC.BGE.0424SPVCOS 14.08
我们走了,这段代码将处理数据中的各种故障。
例如,如果浮动值不在最后也将被覆盖,如果(...)
数据没有固定在第二个位置而是第一个位置,那么也将被覆盖。
答案 2 :(得分:0)
如果每一行都有类似(code you want) (thing you don't want)
的内容,您可以尝试使用正则表达式。
import re
infile = 'reach.txt'
outfile = 'outreach.txt'
with open(infile, 'r') as inf, open(outfile, 'w') as outf:
for line in inf:
# each line has "* (what you want) (trash) *"
# always take first one
first = re.findall("(\([A-z0-9\.]*\))", line)[0]
items = line.strip().split(" ")
second = line[-1]
to_write = " ".join((first, second))
outf.write(to_write + "\n")
正则表达式"(\([A-z0-9\.]*\))"
匹配以下任意组合(由[ ]*
表示):
A-z
),0-9
)和\.
)位于括号内(\( \)
)。
在您的示例中,总会有两个匹配项,例如ZS.MC.BLK.0424SPVCOS
和21.12
。 re.findall
将按照给定的顺序找到这两个。由于你想要的那个总是第一个,所以用re.findall(regex, line)[0]
抓住它。
答案 3 :(得分:0)
blacklist = set('1234567890.')
with open('reach.txt') as infile, open('outreach.txt', 'w') as outfile:
for line in infile:
line = line.strip()
if not line:
continue
_left, line = line.split("(", 1)
parts = [p.rstrip(")").lstrip("(") for p in line.split()]
parts = [p for i,p in enumerate(parts) if not all(char in blacklist for char in p) or i==len(parts)-1]
outfile.write("%s\n" %(' '.join(parts)))
使用您的示例reach.txt
,我得到了
ZS.MC.BGE.0424SPVCOS 14.08
ZS.MC.BLK.0424SPVCOS 14.08
ZS.MC.GRY.0424SPVCOS 14.08
ZS.MC.BLK.0525SPVCOS3 14.08
ZS.MC.GRY.0525SPVCOS2 14.08
ZS.MC.BGE.0424SPVCOS 14.08