使用 if 语句将 CSV 行作为复杂列表理解的列表
Yield CSV row as list of complex list comprehension with if statements
我试图将 CSV 的每一行分别生成为 int
、float
、str
的列表,同时将列表理解与 if 语句一起使用。
如何使用 if 语句编写列表理解,将 CSV 行的每个元素分别转换为 int
、float
、str
?
问题:创建为字符串的浮点数。
import csv
FILE = "file.csv"
def all_values(file):
with open(file, "r") as file_open:
reader = csv.reader(file_open)
for row in reader:
yield [
int(x)
if x.isnumeric() else float(x)
if x.isdecimal() else x
for x in row
]
values = [x for x in all_values(FILE)]
print(values)
部分代码有问题:
yield [
int(x)
if x.isnumeric() else float(x)
if x.isdecimal() else x
for x in row
]
文件:
100,"Jin",10.56
200,"Tonic",15.99
300,"Vodka",20.39
输出:
[[100, 'Jin', '10.56'], [200, 'Tonic', '15.99'], [300, 'Vodka', '20.39']]
错误的值类型:
'10.56'
、'15.99'
、'20.39'
感谢您的宝贵时间。
如评论中所述,isdecimal()
返回 False
因为 .
不被视为十进制字符。相反,您可以将代码更改为:
yield [
int(x)
if x.isnumeric() else float(x)
if x.replace('.','',1).isdigit() else x
for x in row
]
在这种情况下,检查的顺序很重要,int 必须在第一位。
如果它是浮点数或不是浮点数,另一个让它更安全的选项:
def is_float(element) -> bool:
try:
float(element)
return True
except ValueError:
return False
def all_values(file):
with open(file, "r") as file_open:
reader = csv.reader(file_open)
for row in reader:
yield [
int(x)
if x.isnumeric() else float(x)
if is_float(x) else x
for x in row
]
我试图将 CSV 的每一行分别生成为 int
、float
、str
的列表,同时将列表理解与 if 语句一起使用。
如何使用 if 语句编写列表理解,将 CSV 行的每个元素分别转换为 int
、float
、str
?
问题:创建为字符串的浮点数。
import csv
FILE = "file.csv"
def all_values(file):
with open(file, "r") as file_open:
reader = csv.reader(file_open)
for row in reader:
yield [
int(x)
if x.isnumeric() else float(x)
if x.isdecimal() else x
for x in row
]
values = [x for x in all_values(FILE)]
print(values)
部分代码有问题:
yield [
int(x)
if x.isnumeric() else float(x)
if x.isdecimal() else x
for x in row
]
文件:
100,"Jin",10.56
200,"Tonic",15.99
300,"Vodka",20.39
输出:
[[100, 'Jin', '10.56'], [200, 'Tonic', '15.99'], [300, 'Vodka', '20.39']]
错误的值类型:
'10.56'
、'15.99'
、'20.39'
感谢您的宝贵时间。
如评论中所述,isdecimal()
返回 False
因为 .
不被视为十进制字符。相反,您可以将代码更改为:
yield [
int(x)
if x.isnumeric() else float(x)
if x.replace('.','',1).isdigit() else x
for x in row
]
在这种情况下,检查的顺序很重要,int 必须在第一位。
如果它是浮点数或不是浮点数,另一个让它更安全的选项:
def is_float(element) -> bool:
try:
float(element)
return True
except ValueError:
return False
def all_values(file):
with open(file, "r") as file_open:
reader = csv.reader(file_open)
for row in reader:
yield [
int(x)
if x.isnumeric() else float(x)
if is_float(x) else x
for x in row
]