【问题标题】:How to get a number greater than a threshold out of a string inside csv如何从csv中的字符串中获取大于阈值的数字
【发布时间】:2022-10-16 07:39:02
【问题描述】:

我以前写过一个代码,它只检查某个字母是否在 csv 文件的第二行内,然后打印与其对应的第一行,但现在我需要它来检查最高数字是否高于 0.80 以及“BestLetter”部分中有哪些字母。这是我当前的代码:

import csv
import os

with open('test.csv', 'r') as f:
  reader = csv.reader(f, delimiter=',')
for row in reader:
  if "ar" in row[1]: # this takes the first instance of a standalone letter
    print(row[0])

现在我正在尝试这样的事情:

for n in row[1]:
    if n.isdigit():
        print(n.isdigit())

但我不确定我的逻辑是否正确,因为它似乎不起作用。下面还有一个我必须使用的 .csv 文件中的示例

#foo,["BestLetter":"B","allLetters":{"A":0.5,"B":90.0,"C":0.0,"D":0.0,"E":0.0,"F":0.0,"G":1.4,"H":0.0,"I":0.0,"J":0.0,"K:7.3,"L":0.7}]

在这种情况下,B 高于 0.80

任何帮助,将不胜感激!

【问题讨论】:

  • 您还没有包含生成row 的部分。
  • 还是#foo,["BestLetter":"B","allLetters":{... CSV 文件中的实际内容或csv.reader() 返回的内容?您的示例不清楚,您需要提供更好的流程示例。
  • @AdrianKlaver 嗨,对不起,我修复了它,csv 文件中的内容正是我提供的,但#foo 是内部链接,这是唯一的区别。除此之外的结构相同。
  • 是否可以更改生成 CSV 的代码以产生略有不同的输出?

标签: python csv


【解决方案1】:

如果我正确理解您的问题,您可以将条目转换为浮点数以将其与 0.8 进行比较。把它放在一个 try except 在你的循环中,然后在 except 块中继续

for n in row[1]:
    try:
        num = float(n)
        if num > 0.8:
            print(n)
    except:
        continue

isdigit() 在这里不起作用,因为当有“。”时它返回 false在字符串中。

【讨论】:

    【解决方案2】:

    随着输入数据的微小变化:

    #foo|{"BestLetter":"B","allLetters":{"A":0.5,"B":90.0,"C":0.0,"D":0.0,"E":0.0,"F":0.0,"G":1.4,"H":0.0,"I":0.0,"J":0.0,"K":7.3,"L":0.7}}
    

    使用 | 作为分隔符并将第二项更改为 JSON 对象字符串。还将"K:7.3 更正为"K":7.3。将上述文件保存在名称为number_test.csv 的文件中

    然后:

    import csv
    import json
    
    with open("number_test.csv") as csv_f:
        csv_reader = csv.reader(csv_f, delimiter='|')
        letter_dict = {}
        for row in csv_reader:
            j = json.loads(row[1])
            best_letter = j["BestLetter"]
            for letter in j["allLetters"]:
                if j["allLetters"][letter] > 0.80:
                    letter_dict.update({letter: j["allLetters"][letter]})
                letters_sorted = sorted(letter_dict.items(), key=lambda item: item[1], reverse=True)
    
    best_letter
    'B'
    
    letters_sorted
    [('B', 90.0), ('K', 7.3), ('G', 1.4)]
    
    top_letter = letters_sorted[0]
    ('B', 90.0)
    
    
    
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      相关资源
      最近更新 更多