Python 识别逗号之间的空格

Python 识别逗号之间的空格,python,python-3.x,Python,Python 3.x,我需要确定一个数字和逗号之间是否有空格,那么这个数字是无效的。因此,如果该数字在逗号之间有多于或少于2个小数位和/或空格,则该数字无效,但如果该数字在逗号之间没有空格,且有2个小数位,则该数字有效。这就是为什么第1行中的第一个数字是有效的 有两种方法,我更喜欢使用方法2,但我想如果我使用两种方法,它可能会帮助你们中的任何人添加 #-----------Method 1------------------------------------------ res = 0 outfile = "out

我需要确定一个数字和逗号之间是否有空格,那么这个数字是无效的。因此,如果该数字在逗号之间有多于或少于2个小数位和/或空格,则该数字无效,但如果该数字在逗号之间没有空格,且有2个小数位,则该数字有效。这就是为什么第1行中的第一个数字是有效的

有两种方法,我更喜欢使用方法2,但我想如果我使用两种方法,它可能会帮助你们中的任何人添加

#-----------Method 1------------------------------------------
res = 0
outfile = "output2.txt"
baconFile = open(outfile,"wt")
index = 0
invalid_string = "INVALID"
valid_string = "VALID"
with open('file.txt') as file:
    for line in file:
        carrera = ''
        index = index + 1
        print("Line {}: ".format(index), end='')
        baconFile.write("Line {}:  ".format(index))
        number_list = line.strip().split(',')
        for number in number_list:
            if len(number.split('.')[-1]) == 2:
                #res += 1
##              print("VALID")

                carrera = valid_string 
            if len(number.split('.')[-1]) != 2:
                #res += 1
                carrera = invalid_string
            if len(number.split(',')[-1]) == " ":                         #checking for whitespace 
                carrera = invalid_string

            print (carrera, end=' ')
            baconFile.write(carrera + " ")
        print('\n', end='')
        baconFile.write('\n')
baconFile.close()
#-----------Method 2------------------------------------------

res = 0
outfile = "output2.txt"
baconFile = open(outfile,"wt")
index = 0
invalid_string = "INVALID"
valid_string = "VALID"
with open('file.txt') as file:
    for line in file:
        index = index + 1
        o = "Line {}: ".format(index)
        number_list = line.strip().split(',')
        for x in number_list:
            if len(x.split('.')[-1]) == 2:
                o += valid_string + " "
            if len(x.split('.')[-1]) != 2:
                o += invalid_string + " "
            if len(x.split(',')[-1]) == " ":
                o += valid_string + " "
以下是我在Text.file中的数字列表:

1,1.02, 123.0005

1.02, 1.02 , 1.02
预期:

Line 1: INVALID VALID INVALID

Line 2: VALID INVALID INVALID (since there's spaces between the last number that's why it is INVALID) 
实际:

Line 1: INVALID VALID INVALID

Line 2: VALID INVALID VALID

使用
decimal.decimal
对象,您可以检索指数,它以某种方式告诉您小数位数():

输出

#with line = "1,1.02, 123.0005"
'Line 1: INVALID VALID INVALID'

#with line = "1.02, 1.02 , 1.02"
'Line 2: VALID INVALID INVALID'

您可以使用
拆分字符串,并根据字符串是否以空格开头来决定字符串是否有效

#Open the files
with open('file.txt') as fp:

    #Extract out non-empty lines from file
    lines = [line for line in fp.readlines() if line.strip()]
    res = []

    #Iterate over the lines
    for idx, line in enumerate(lines):

        #Number is valid if it doesn't start with a whitespace, has a decimal part and the decimal part is two digits long
        res = ['VALID' if not item.startswith(' ') and '.' in item and len(item.split('.')[1]) == 2 else 'INVALID' for item in line.split(',')]

        #Print the result
        print("Line {}: {}".format(idx+1, ' '.join(res)))
输出将是

Line 1: INVALID VALID INVALID
Line 2: VALID INVALID INVALID
试试这个:

line="1,1.02, 123.0005"
reslt=line.split(",")
Res=" "
for i in reslt:
    if " "in i:
        line1="INVALID "
    else:
        line1="VALID "
    Res +="".join(line1)
print("line1:"+Res)
从文件中读取:

nbline

with open('file.txt') as f:
    for line in f.readlines():
        print(line)
        reslt=line.split(",")
        Res=" "
        for i in reslt:
            if " "in i:
                line1="INVALID "
            else:
                line1="VALID "
            Res +="".join(line1)
    nbline = nbline+1
    print("line {}:{}".format(nbline,Res))
输出:
行1:VALID-VALID-INVALID

基于逗号拆分的列表理解,再加上一点字符串技巧就简单多了:

line="1,1.02, 123.0005"
result = " ".join("IN"*(" " in s)+"VALID" for s in line.split(","))
print(result) # VALID VALID INVALID

为什么
第1行
第一个数字无效?
1、
应该有效,因为它不是以空格开头的,我已经假设了这一点,并试图在@Slashx43找到一个答案。检查一下out@SebastienD抱歉,我忘了提及哪些数字符合有效或无效条件我更新了我的问题感谢@Slashx43的更新我已根据您的新输入更新了答案中的条件,请看一看,我认为可读性/理解能力比减少代码行数更重要。“*(”IN s)中的
”是纯粹的巫术。@牙签海葵,我同意你关于易读性的观点。有时很难驱除我体内的巨蟒术士:)@AlainT。谢谢,但我需要从文本文件中读取/写入数字,而不是代码中的数字。因为您的代码显示您已经知道如何读取文件中的行,所以我不认为重复该部分是相关的。我还觉得它会将实际解决方案隐藏在锅炉板代码下。这很有帮助,但我从文本文件中获取数字列表,而不是代码本身。我已经更新了代码,并添加了一个部分来读取表单文件。我看到了它的工作原理,但当我将其放入代码中时,它不会打印出第1行:无效。它只是说有一个无效的语法,它是print语句中的最后一个引号。print语句中f的用途是什么?如果我删除了f,那么它会打印出来:行{idx+1}:{'。连接(res)}行{idx+1}:{'。连接(res)}啊好的,你使用的是什么python版本?这些是f-strings,一种格式化字符串的新方法,但对于python3.6及更高版本,无论如何,我已经恢复为旧的string.format,它应该适合您@Slashx43您可以再试一次,它将适合您
line="1,1.02, 123.0005"
result = " ".join("IN"*(" " in s)+"VALID" for s in line.split(","))
print(result) # VALID VALID INVALID