使用python解析CSV文件(稍后生成决策树)

2024-05-17 09:03:53 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,完全公开:这将是一个uni分配,所以我不想收到代码。:). 我更多的是寻找方法;我对python很陌生,读过一本书,但还没有写过任何代码。

整个任务是导入CSV文件的内容,从CSV文件的内容创建一个决策树(使用ID3 algorithm),然后解析第二个CSV文件以在树上运行。有一个很大的(可以理解的)偏好是让它能够处理不同的CSV文件(我问过我们是否允许硬编码列名,主要是为了排除这种可能性,而答案是否定的)。

CSV文件采用相当标准的格式;标题行用#标记,然后显示列名,之后的每一行都是一系列简单的值。示例:

# Column1, Column2, Column3, Column4
Value01, Value02, Value03, Value04
Value11, Value12, Value13, Value14

目前,我正在努力解决第一部分:解析CSV。为了为决策树做出决策,字典结构似乎是最符合逻辑的;所以我想按照以下思路做些事情:

Read in each line, character by character
If the character is not a comma or a space
    append character to temporary string
If the character is a comma
    Append the temporary string to a list
    Empty string
Once a line has been read
    Create a dictionary using the header row as the key (somehow!)
    Append that dictionary to a list

但是,如果我这样做,我不知道如何在键和值之间建立映射。我还想知道是否有办法对列表中的每一个字典执行一个操作,因为我需要做的事情是“每个人都返回第1列和第4列的值,这样我就可以计算出谁拥有什么!”-我认为有某种机制,但我不知道该怎么做。

字典是最好的方法吗?使用其他数据结构做事情会更好吗?如果是,怎么办?


Tags: 文件csvtheto方法代码决策树内容
3条回答

简而言之:不要浪费时间和精力(1)重新实现内置的csv模块(2)读取csv模块的源代码(它是用C编写的)--只要使用它!

使用docs.python.org中的csv模块的示例:

import csv
reader = csv.reader(open("some.csv", "rb"))
for row in reader:
    print row

您只需将每一行保存到一个列表中,然后在ID3中处理它,而不需要对行进行print

database.append(row)

Python内置了一些非常强大的语言构造。您可以从文件中读取行,如:

with open(name_of_file,"r") as file:
    for line in file:
         # process the line

可以使用string.split函数沿逗号分隔行,也可以使用string.strip来消除中间的空白。Python有非常强大的listsdictionaries

要创建一个列表,只需使用像[]这样的空括号,而要创建一个空字典,则使用{}:

mylist = []; # Creates an empty list
mydict = {}; # Creates an empty dictionary

您可以使用.append()函数插入列表,而可以使用索引下标插入字典。例如,可以使用mylist.append(5)将5添加到列表中,而可以使用mydict[key]=value将键key与值value关联。要测试字典中是否存在密钥,可以使用in关键字。例如:

if key in mydict:
   print "Present"
else:
   print "Absent"

要遍历列表或字典的内容,只需使用for循环,如下所示:

for val in mylist:
    # do something with val

for key in mydict:
    # do something with key or with mydict[key]

由于在许多情况下,在遍历列表时必须同时具有值和索引,因此还有一个名为enumerate的内置函数,可以省去自己计算索引的麻烦:

for idx, val in enumerate(mylist):
    # do something with val or with idx. Note that val=mylist[idx]

上述代码在功能上与以下代码相同:

idx=0
for val in mylist:
   # process val, idx
   idx += 1

如果您这样选择,您还可以在索引上迭代:

for idx in xrange(len(mylist)):
    # Do something with idx and possibly mylist[idx]

此外,还可以使用len获取列表中的元素数或字典中的键数。

通过使用列表理解,可以对字典或列表的每个元素执行操作;但是,我建议您只使用for循环来完成该任务。但是,举个例子:

>>> list1 = range(10)
>>> list1
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list2 = [2*x for x in list1]
>>> list2
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

当你有时间的时候,我建议你阅读Python tutorial来获得更深入的知识。

相关问题 更多 >