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