我写了一个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 库,但我更愿意自己这样做。
我选择的方法是否合理/可行?你有没有更好的方法来做到这一点?如果是这样,怎么样?
答案 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'>]
我很确定有更优雅的方式。