遍历CSV以确定数据类型

时间:2019-12-20 22:01:20

标签: python loops file csv

因此,我正在使用Python进行入门课程,我需要执行以下操作:有一个CSV文件,其中有10列,填充了200行。每个值都有一个strintfloat作为值。

示例输入:

id  gender  age marital location    income  intelliscore    emotiscore
51  F   46  M   0   15100   531 555
52  M   29  M   2   14200   673 633
53  M   25  S   0   22200   742 998
54  M   36  M   2   1000    677 646
55  F   99  S   0   10600   608 998

现在我要做的是创建另一个CSV文件,并用类型“替换”这些值。因此,理想的结果将是:

'string', 'string', 'string', 'string', 'string', 'string', 'string', 'string'
'int', 'string', 'int', 'string', 'int', 'int', 'int', 'int', 'int'
'int', 'string', 'int', 'string', 'int', 'int', 'int', 'int', 'int'
'int', 'string', 'int', 'string', 'int', 'int', 'int', 'int', 'int'
'int', 'string', 'int', 'string', 'int', 'int', 'int', 'int', 'int'

我当前使用的代码是:

def csvfields2types(self, csvfile):
    csvtypes = []
    for line in csvfile:
        row = []
        for variable in line:
                if variable == str:
                    row.append('string')
                elif variable == float:
                    row.apend('float')
                elif variable == int:
                    row.append('int')
                else:
                    row.append('huh?')
        csvtypes.append(row)
    return csvtypes

它只返回带有“呵呵”的列表。

4 个答案:

答案 0 :(得分:0)

您正在检查变量的值是否为字符串。您想检查它的类型是否是字符串...

if type(variable) == str:

答案 1 :(得分:0)

您是否熟悉Python中的EAFP原理?如果没有,请查看以下问题:What is the EAFP principle in Python?

我们可以在此处执行类似的操作:您可以使用try“测试”类型,只需假设字符串代表该类型的值并将其转换即可。如果可行,我们找到了一个匹配的类型。如果失败,我们尝试下一种。您必须确保以限制性最强的类型int开始(因为所有整数也可以解释为以.0结尾的浮点数),然后是float,然后是{{1} }。

将其放入函数中可能类似于:

str

一些例子:

def check_type(input_string):
    try:
        int(input_string)
        return int
    except ValueError:
        pass
    try:
        float(input_string)
        return float
    except ValueError:
        pass
    return str

顺便说一句,不要被scientific notation所迷惑,这也是可接受的float输入:

>>> check_type("10")
<class 'int'>
>>> check_type("10.1")
<class 'float'>
>>> check_type("A")
<class 'str'>

答案 2 :(得分:0)

如果从对象创建熊猫数据框,则可以执行以下操作:

import pandas as pd
df = pd.read_csv('out146.txt', delim_whitespace=True)
for col in df: 
   df[col] = df[col].apply(lambda x: f"""'{re.findall(r"'(.*?)'",str(type(x))).pop()}'""") 

输出:

      id gender    age marital location income intelliscore emotiscore
0  'int'  'str'  'int'   'str'    'int'  'int'        'int'      'int'
1  'int'  'str'  'int'   'str'    'int'  'int'        'int'      'int'
2  'int'  'str'  'int'   'str'    'int'  'int'        'int'      'int'
3  'int'  'str'  'int'   'str'    'int'  'int'        'int'      'int'
4  'int'  'str'  'int'   'str'    'int'  'int'        'int'      'int'

答案 3 :(得分:0)

假设输入CSV文件(csvfile.csv)仅由一个空格字符(“”)分隔,则可以定义两种方法来确定每行上的每个元素是整数还是浮点数(如果不是)应该是一个字符串),然后使用csv Python module

一个将所需结果写入新output.csv文件的工作示例如下:

import csv

def isint(n):
    try:
        int(n)
        return True
    except:
        return False

def isfloat(n):
    try:
        float(n)
        return True
    except:
        return False

csvfile = list(csv.reader(open("csvfile.csv", "r"), delimiter=" "))
out = csv.writer(open("output.csv", "w"), delimiter=",")

for line in csvfile:
    row = []
    for variable in line:
        if isint(variable) == True:
            row.append('int')
        elif isfloat(variable) == True:
            row.append('float')
        else:
            row.append('str')
    out.writerow(row)