Python 解析文件中字符串中的数字

Python 解析文件中字符串中的数字,python,Python,我有一个txt文件,如下所示: pid,党,州,res SC5,共和党人,纽约州,唐纳德·特朗普45%-马可·鲁比奥18%-约翰·卡西奇18%-特德·克鲁兹11% TB1,共和党,阿肯色州,特德·克鲁兹27%-马可·卢比奥23%-唐纳德·特朗普23%-本·卡森11% 佛罗里达州民主党人希拉里·克林顿61%-伯尼·桑德斯34% BN1,民主党,佛罗里达州,希拉里·克林顿61%-伯尼·桑德斯30% PB2,民主党,噢,希拉里·克林顿56%-伯尼·桑德斯35% 我想做的是检查每个“res”的百分比是

我有一个txt文件,如下所示:

pid,党,州,res
SC5,共和党人,纽约州,唐纳德·特朗普45%-马可·鲁比奥18%-约翰·卡西奇18%-特德·克鲁兹11%
TB1,共和党,阿肯色州,特德·克鲁兹27%-马可·卢比奥23%-唐纳德·特朗普23%-本·卡森11%
佛罗里达州民主党人希拉里·克林顿61%-伯尼·桑德斯34%
BN1,民主党,佛罗里达州,希拉里·克林顿61%-伯尼·桑德斯30%
PB2,民主党,噢,希拉里·克林顿56%-伯尼·桑德斯35%
我想做的是检查每个“res”的百分比是否达到100%

def addPoll(pid,party,state,res,filetype):
    with open('Polls.txt', 'a+') as file:  # open file temporarly for writing and reading
        lines = file.readlines()  # get all lines from file
        file.seek(0)
        next(file)  # go to next line --
        #this is suppose to skip the 1st line with pid/pary/state/res
        for line in lines:  # loop
            line = line.split(',', 3)[3]
            y = line.split()
            print y
            #else:
                #file.write(pid + "," + party + ","  + state + ","  + res+"\n")
                #file.close()
    return "pass"
print addPoll("123","Democratic","OH","bla bla 50%-Asd ASD 50%",'f')

因此,在我的代码中,我设法将最后一个“,”拆分并输入到一个列表中,但我不确定如何从该文本中仅获取数字。

您可以使用正则表达式查找所有数字:

import re
for line in lines:
    numbers = re.findall(r'\d+', line) 
    numbers = [int(n) for n in numbers]
    print(sum(numbers))
这会打印出来

0    # no numbers in the first line
97
85
97
92
93

re.findall()
方法查找与指定模式匹配的所有子字符串,在本例中为
\d+
,表示任何连续的数字字符串。这将返回一个字符串列表,我们将其转换为
int
s列表,然后求和。

看起来您拥有的是CSV。Python将为您提供漂亮的字典(因此您可以执行
line['res']
),而不是试图自己解析它:

对于
#Do something
部分,您可以手动解析字段(它似乎是结构化的):
split('-')
,然后
rsplit('',1)
每个
-
分离的部分(最后一件事应该是百分比)。如果您试图强制执行一种格式,那么我肯定会走这条路,但是regex也是一个很好的解决方案,可以快速提取您想要的内容。您可能想了解它们,但在您的情况下,您需要
\d+%

# Manually parse (throws IndexError if there isn't a space separating candidate name and %)
percents = [candidate.rsplit(' ', 1)[1] for candidate row['res'].split('-')]

if not all(p.endswith('%') for p in percents):
    # Handle bad percent (not ending in %)
    pass
else:
    # Throws ValueError if any of the percents aren't integers
    percents = [int(p[:-1]) for p in percents]

    if sum(percents) != 100:
        # Handle bad total
        pass
或使用正则表达式:

percents = [int(match.group(1)) for match in re.finditer(r'(\d+)%', row['res'])]

if sum(percents) != 100:
    # Handle bad total here
    pass
Regex当然更短,但前者将对
行['res']
强制执行更严格的格式要求,并允许您稍后提取候选名称等内容

还有一些随机注释:

  • 您不需要使用
    'a+'
    打开,除非您计划附加到文件,
    'r'
    就可以了(而且
    'r'
    是隐式的,所以您不必指定它)
  • 使用for循环代替
    next()
    
对[0-9][0-9]['%]使用
然后是您想做的事情。。收集价值。但请记住,您包括一个线路计数器。。因为接下来需要做的是将从正则表达式捕获器收集的所有数据相加。检查其他SO页面是否正确使用常规表达式。
percents = [int(match.group(1)) for match in re.finditer(r'(\d+)%', row['res'])]

if sum(percents) != 100:
    # Handle bad total here
    pass