从CSV文件行中的值确定数据类型

时间:2016-07-18 15:56:33

标签: python mysql python-3.x csv

我写了一个Python程序,它读取CSV文件并将它们作为MySQL的插入语句吐出。现在我想要一个能够使用列标题为每个新表格形成CREATE语句的附加程序。由于MySQL格式化,我需要能够确定列中每个值的类型,类似于shell中的type()函数。我的想法是在列标题之后读取CSV文件的第二行,并拉出由,分隔的值(即每列中的一个值)。然后获取该值并通过type()函数运行它并返回int, str, float, etc.。稍后,我将使用if statements返回的值执行一些type(),以将正确的数据类型附加到CREATE语句的列标题的末尾。

到目前为止,我已设法将第一行的已编译列表中的每个值拉出并打印出type()。唯一的问题是列表中的所有内容都被视为字符串,因此唯一的返回值为<class 'str'>。如果我知道它是什么类型的值,我将能够从字符串转换为正确的类型,但这会破坏程序的整个目的。我确信有一种更好的方法可以将第一行作为字符串列表吐出,但我不知道该怎么做。以下是我到目前为止以及如何继续的想法:

import csv, os

path = 'C:/Users/user/Desktop/file/test/'
for file in os.listdir(path):
    if file.endswith('.csv'):
        with open(path +file) as inFile:
            with open(path + file[:-4] + ".txt", "w") as outFile:
                csvFile = csv.reader(inFile)
                columnHeader = next(csvFile)
                firstRow = next(csvFile)
                i = 0
                for value in firstRow:
                    valueType = (type(value))
                    for header in columnHeader:
                        if valueType = class 'str': # Don't think this formatting is correct
                            columnHeader.append(' varchar (255)')
                        if valueType = class 'int':
                            columnHeader.append(' int')
                        if valueType = class 'float':
                            columnHeader.append(' float')

我也考虑过使用 this 库,但我更愿意自己这样做。

我选择的方法是否合理/可行?你有没有更好的方法来做到这一点?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:3)

这是区分float和int的一种可能性,并假设其他所有内容都是字符串。如果该值具有小数点,则它会尝试将其转换为float并尝试将其转换为int(如果不是)。如果任一转换失败,则将该值保留为字符串。

if '.' in val:
    try:
        val = float(val)
    except ValueError:
        pass
else:
    try:
        val = int(val)
    except ValueError:
        pass

答案 1 :(得分:3)

这将是简单的方式:

def find_type(a):
    try:
        var_type = type(int(a))
    except ValueError:
        try:
            var_type = type(float(a))
        except ValueError:
            var_type = type(a)
    return var_type

a = ['123123', '11.21', 'Some Bank', '11/2/1995']

print([find_type(x) for x in a])
#[<class 'int'>, <class 'float'>, <class 'str'>, <class 'str'>]

我很确定有更优雅的方式。