【发布时间】:2016-11-21 07:48:02
【问题描述】:
我编写了一个 Python 程序,它读取 CSV 文件并将它们作为 MySQL 的插入语句输出。现在我想要一个能够使用列标题为每个新表形成CREATE 语句的附加程序。由于 MySQL 格式,我需要能够确定列中每个值的类型,类似于 shell 中的 type() 函数。我的想法是在列标题之后读取 CSV 文件的第二行,并提取由 , 分隔的值(即每列中的一个值)。然后获取该值并通过type() 函数运行它并返回int, str, float, etc.。稍后我将使用type() 返回的值执行一些if statements,以将正确的数据类型附加到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 库,但更愿意自己做。
我选择的方法是否合理/可行?你能想到什么更好的方法来做到这一点吗?如果有,怎么做?
【问题讨论】:
-
好久没看到好问题了。谢谢!!我想到了两件事:*一系列
try-except块 (try: int(x), except: try: float(x), except str(x)) 或使用eval的东西,这将非常优雅。 -
@MarcB 这正是我上面所说的。这些 CSV 文件中包含大量数据,因此手动执行此操作是不合理的。
标签: python mysql python-3.x csv