Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python:读入表并将每列转换为正确的数据类型_Python - Fatal编程技术网

python:读入表并将每列转换为正确的数据类型

python:读入表并将每列转换为正确的数据类型,python,Python,假设我有一个文本文件,如下所示: 3, 4.32, hi 7, 3.23, hello 当我读入这个文件时,所有条目都被视为字符串。是否有一种方法可以将它们自动转换(在我的示例中)为int、float和string?一种基本方法: def guess(text): for t in text.split(','): for typ in (int, float, str): try: yield typ(t)

假设我有一个文本文件,如下所示:

3, 4.32, hi
7, 3.23, hello
当我读入这个文件时,所有条目都被视为字符串。是否有一种方法可以将它们自动转换(在我的示例中)为int、float和string?

一种基本方法:

def guess(text):
    for t in text.split(','):
        for typ in (int, float, str):
            try:
                yield typ(t)
                break
            except ValueError as e:
                pass

d = '3, 4.32, hi'

print list(guess(d))
# [3, 4.32, ' hi']
# [<type 'int'>, <type 'float'>, <type 'str'>]

如果在所有文件中都有固定模式,则另一个快捷方式

def update_types():
    f = open("txtfile", "r")
    reader = f.readlines()
    for line in reader:
        parts = line.split(',')
        parts[0], parts[1] = int(parts[0]), float(parts[1])
        for part in parts:
            print type(part)
    f.close()

如果您事先知道类型,则可以执行以下操作:

import csv
type_funcs = [int, float, str]
with open('yourfile.csv', 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
        typed_row = [func(val) for func, val in zip(type_funcs, row)]

您知道模式总是
int
float
str
?或者你想让它们自动转换成任何“有意义的”?你说的自动是什么意思?我的意思是你可以假设每一列都有相同的“true”数据类型,但我想对多个文本文件这样做。这基本上是可行的,因为int转换比float转换更具限制性,哪一个比str转换更严格?您已经有了
str
(几乎没有操作)-所以这是最后一个。。。而
float
会吞下
int
,所以它在
float
之前。。。所以,基本上是的。如果你知道它们应该是什么类型-这是一种更好的方法,否则,通常你会使用这种排序…@qua我还添加了一个选项,使用
ast.literal\u eval
,这可能会更好+1,因为
literal\u eval
选项可能是最好的方法,因为有评论说要分析实际的类型,而不是通过编程猜测。@Jon Clements:谢谢你的第二个答案。我真正想要的是从条目中提取数据类型,而不是转换它。我可以看到如何修改您的第一个答案,但是是否有类似于literal_eval的方法来获取数据类型?
import csv
type_funcs = [int, float, str]
with open('yourfile.csv', 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
        typed_row = [func(val) for func, val in zip(type_funcs, row)]