使用各种分隔符处理文本文件

2024-04-26 21:51:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我的文本文件(很不幸)看起来像这样。。。你知道吗

<amar>[amar-1000#Fem$$$_Y](1){india|1000#Fem$$$,mumbai|1000#Mas$$$}
<akbar>[akbar-1000#Fem$$$_Y](1){}
<john>[-0000#$$$_N](0){USA|0100#$avi$$,NJ|0100#$avi$$}

它包含客户名称,后跟一些信息。顺序是。。。你知道吗

文本字符串,后跟列表、集合和字典

<;>;[](){}

这是与python不兼容的文件,因此数据不符合预期。我想处理文件并提取一些信息。你知道吗

amar 1000 | 1000  | 1000
akbar 1000  
john 0000  | 0100 | 0100

1)名称介于<;>

2)列表中介于-和#之间的数字

3&4)根据逗号和|和#之间的数字拆分字典(这里可以有两个以上的条目)

我愿意使用任何最适合这个任务的工具。你知道吗


Tags: 文件ltgt名称信息列表字典数字
3条回答

下面的Python脚本将读取文本文件并给出所需的结果:

import re, itertools

with open("input.txt", "r") as f_input:
    for line in f_input:
        reLine = re.match(r"<(\w+)>\[(.*?)\].*?{(.*?)\}", line) 
        lNumbers = [re.findall(".*?(\d+).*?", entry) for entry in  reLine.groups()[1:]]
        lNumbers = list(itertools.chain.from_iterable(lNumbers))
        print reLine.group(1), " | ".join(lNumbers)

这将打印以下输出:

amar 1000 | 1000 | 1000
akbar 1000
john 0000 | 0100 | 0100

可以将所有分隔符添加到和count字段中的FS变量,如:

awk -F'[<>#|-]' '{ print $2, $4, $6, $8 }' infile

如果大括号之间有两个以上的条目,可以使用循环遍历所有字段,直到最后一个字段,如:

awk -F'[<>#|-]' '{ 
    printf "%s %s ", $2, $4
    for (i = 6; i <= NF; i += 2) { 
        printf "%s ", $i 
    }
    printf "\n" 
}' infile

两个命令产生相同的结果:

amar 1000 1000 1000 
akbar 1000 
john 0000 0100 0100

由于语法相当复杂,您可能会找到一个合适的解析器,这是最好的解决方案。你知道吗

#!/usr/bin/env python

import fileinput
from pyparsing import Word, Regex, Optional, Suppress, ZeroOrMore, alphas, nums


name = Suppress('<') + Word(alphas) + Suppress('>')
reclist = Suppress('[' + Optional(Word(alphas)) + '-') + Word(nums) + Suppress(Regex("[^]]+]"))
digit = Suppress('(' + Word(nums) + ')')
dictStart = Suppress('{')
dictVals = Suppress(Word(alphas) + '|') + Word(nums) + Suppress('#' + Regex('[^,}]+') + Optional(','))
dictEnd = Suppress('}')

parser = name + reclist + digit + dictStart + ZeroOrMore(dictVals) + dictEnd

for line in fileinput.input():
    print ' | '.join(parser.parseString(line))

此解决方案使用pyparsing库并运行生成:

$ python parse.py file
amar | 1000 | 1000 | 1000
akbar | 1000
john | 0000 | 0100 | 0100

相关问题 更多 >