【问题标题】:String to float python -incorrect format?浮动python的字符串 - 格式不正确?
【发布时间】:2018-10-29 15:39:00
【问题描述】:

编辑:

with open("example.csv", "r", encoding="utf-8", errors="ignore") as new_data:
reader = csv.reader(new_data, delimiter=',', quotechar='"')
for row in reader:
    if row:
        if row[1] is not None:
            columns = (row[0], row[1].replace(",","."), row[2])
            ean = row[0]
            print(row[1])
            prices = float(row[1].replace(",","."))
            desc = row[2]
        #if prices is not None:
            result[ean].append((prices, desc)) 

但我仍然得到奇怪的输出:

C:\Users\User\AppData\Local\Programs\Python\Python37-32\python.exe 
C:/Users/User/AppData/Local/Programs/Python/Python37-32/get_min_price.py
Traceback (most recent call last):
4,43
File "C:/Users/User/AppData/Local/Programs/Python/Python37- 
32/get_min_price.py", line 17, in <module>
4,08
13,30
14,90
prices = float(row[1].replace(",","."))
9,31
5,02
4,19
ValueError: could not convert string to float: 
4,13
16,57
19,95
8,06
5,99
8,06

为了满足 min 函数的需要,我必须将字符串列表转换为浮点数。但是我不能让它工作:

result = defaultdict(list)

with open("example.csv", "r", encoding="utf-8", errors="ignore") as new_data:
reader = csv.reader(new_data, delimiter=',', quotechar='"')
for row in reader:
    if row:
        columns = (row[0], row[1].replace('"','').replace(',','.').strip(), row[2])
        ean = row[0]
        print (row[1])
        prices = float(row[1])
        desc = row[2]
        if prices is not None:
            result[ean].append((prices, desc)) #avoid getting an empty price as minimum value

输出:

4,43
Traceback (most recent call last):
File "C:/Users/User/AppData/Local/Programs/Python/Python37- 
32/get_min_price.py", line 16, in <module>
prices = float(row[1])
ValueError: could not convert string to float: '4,43'

是因为逗号吗?还是有其他原因? (您可能还注意到我添加了第二个 Python 未考虑的“替换”?)

输入示例:

3596206198001,"4,43",A
3596206198001,"4,08",B

【问题讨论】:

  • 请显示输入数据的示例。您不需要替换引号。无论如何,Python 不会忽略您的替换调用,您是;您将它们分配给columns,但随后忽略它并仅引用原始行属性。
  • 用点代替逗号。将4,43 更改为4.43
  • 您需要使用locale库进行欧洲货币转换。见stackoverflow.com/a/40717213/719547
  • 您调用 'replace' 来获取列,但它不会更改行 [1] 内联。您必须在转换为浮动之前再次调用它:prices = float(row[1].replace(',','.'))

标签: python


【解决方案1】:

使用.: 将字符串转换为正确的浮动格式:

prices = float(row[1].replace(",", "."))

【讨论】:

  • 我有同样的输出..prices = float(row[1].replace(",", ".")) ValueError: could not convert string to float:
  • 它可以工作,但是你正在重用仍然有错误字符的row,而不是columns
  • 我更改了 CSV 输入以获取点而不是昏迷。但是我仍然收到相同的消息: ValueError: could not convert string to float: 9.31
  • 您使用的是row 还是columns?后者是你的后处理字符串,row 仍然有"
【解决方案2】:

ValueError 应该在错误之后显示错误的输入。它应该如下所示:

ValueError: could not convert string to float: '4,43'

在冒号后什么也没有得到的事实表明,你实际上没有传递任何东西——即一个空字符串——首先传递给 float 函数。这几乎可以肯定是因为您的 CSV 中的一行(可能是最后一行)此时为空。如果是这种情况,您应该在尝试继续之前添加对空字符串的检查。

【讨论】:

  • 我试图在开头添加一个检查,因为你是对的,那里有空值。但是我不认为我仍然很好。我更新了我的帖子
【解决方案3】:

我不打算回答我自己的问题,但它可能对其他一些初学者有所帮助。 如果您卡在同一点上,只需像这样跟踪错误:

 try:
price = float(price)
 except:
print(float)

因为如前所述,如果您有大量数据,您可能会遇到一些阻塞行或未跟踪的奇怪输入。

你可以改正它,或者用这样的东西忽略错误:

 try:
price = float(price)
 except (TypeError, ValueError):
continue

还要注意您使用的是 dot 而不是 coma(例如 1.6 而不是 1,6)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2013-08-22
    相关资源
    最近更新 更多