【问题标题】:Write a function that reads a file and returns all of the numbers in it as a list of floats编写一个函数,读取一个文件并将其中的所有数字作为浮点数列表返回
【发布时间】:2022-01-17 07:12:42
【问题描述】:

我有一个包含数千行的大文本文件,但包含相同想法的简短示例是:

vapor dust -2C pb 
x14 71 hello! 42.42
100,000 lover baby: -2

整数、字母数字和浮点数混合在一起。

尝试 SOLN。 我这样做是为了创建一个由字符串组成的单个列表,但是我无法根据每个单元格的数字或字母数字来隔离每个单元格

with open ('file.txt','r') as f:
data = f.read().split()
#dirty = [ x for x in data if x.isnumeric()]
print(data)

#dirty 行失败。

我很幸运地使用以下代码构建了一个包含几乎所有必需值的列表:

with open ('benzene_SDS.txt','r') as f:  
    for word in f:
        data= word.split()
        clean = [ x for x in data if x.isnumeric()]            
        res = list(set(data).difference(clean))
        print(clean)

但它不返回单个列表,它是一个列表列表,其中大部分是空白 []。

给出了一个提示,使用“try”控制语句对解决问题很有用,但我不知道如何使用它。

任何帮助将不胜感激!谢谢。

【问题讨论】:

  • 根据您自己的示例数据,您希望输出是什么? IE。应该包括 14 吗? 100,000 怎么样?
  • @Grismar 14 不包括在内,但 100 将是,从分配“函数应该识别像“10823”这样的数字,它们后面有一个逗号或其他字符# REQ2:带连字符的数字 (或其他非数字字符),如 x14 或 727-8989 应跳过。"
  • 嗨,如果更简单的话,我们可以假设我们只需要提供的示例中的真整数和浮点数。我对合并 try 语句感到很困惑。对不起,如果我的知识不好!它对我来说仍然是新的
  • 您可能应该在您的问题中添加一个预期输出的示例,就像我问的那样。例如,对于许多区域设置,'100,000' 将被视为编写100000 的有效方式,而对于其他区域设置,它可能被视为100.000。听起来您只想要完全符合当地区域设置的数值,但值可以用空格和其他分隔符(如逗号)分隔 - 但目前尚不清楚什么是有效的分隔符。 '123; 45-50, 60!' 怎么样?
  • @Grismarit 提示说明该函数应该能够识别像“2019”这样的数字,这些数字后面有逗号或其他字符。并且应该跳过其中包含非数字字符的数字。因此,对于您的示例,该函数将返回 [123.0,60.0]

标签: python string function split control-statements


【解决方案1】:

如果你主要是问如何使用try 来检查有效性,这就是你所追求的:

values = []
with open ('benzene_SDS.txt','r') as f:  
    for word in f.read().split():
        try:
            values.append(float(word))
        except ValueError:
            pass
print(values)

输出:

[71.0, 42.42, -2.0]

但是,这并不是说这不会将 '100,000' 解析为 100100000

这段代码可以做到这一点:

import locale

locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')

values = []
with open('benzene_SDS.txt', 'r') as f:
    for word in f.read().split():
        try:
            values.append(locale.atof(word))
        except ValueError:
            pass

print(values)

结果:

[71.0, 42.42, 100000.0, -2.0]

注意,用这个运行相同的代码:

locale.setlocale(locale.LC_ALL, 'nl_NL.UTF-8')

产生不同的结果:

[71.0, 4242.0, 100.0, -2.0]

由于荷兰使用, 作为小数分隔符,. 作为千位分隔符(基本上在 42.42 中会被忽略)

【讨论】:

  • 如果这回答了您的问题,请考虑勾选复选标记将其变为绿色,表示您的问题不再需要其他答案。
  • 但是,请注意,此解决方案不处理插播,因此数字后跟 ., (或本地接受的任何内容)之外的其他字符仍将被忽略,即数字后跟问号或感叹号。您可能需要一个正则表达式来从中解析数字,但这将更具挑战性。
【解决方案2】:
numbers = []
with open('file.txt','r') as f:
    for line in f.read():
        words = line.split()
        numbers.extend([word for word in words if word.isnumeric()])

# Print all numbers
print(numbers)

# Print all unique numbers
print(set(numbers))

# Print all unique numbers, converted to floats
print([float(n) for n in set(numbers)])

如果您特别需要一个列表,那么您可以使用list() 包装该集合。

【讨论】:

  • 注意'100,000'不是数字,根据.isnumeric;不知道 OP 是否希望包含像 14 这样的数字,但当然也会错过。
  • 您好,这很接近,但我需要完整的数值而不是它们的各个组件。如示例中的71或42.42
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-26
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-19
相关资源
最近更新 更多