从许多CSV文件中提取无法识别的信息

时间:2013-08-12 23:27:22

标签: python csv numpy glob

我是编程新手,我有很多需要处理的CSV文件。每个CSV文件都有一个8行标题。在标题之后,有一些名称和数据行。第二列有一堆产品名称,这是我现在主要关注的。每个产品都有一组由我们的计算机识别的名称。例如鞋子将被识别为:鞋子,运动鞋,鞋跟,乐福鞋等。随着时间的推移,其他名称已经潜入计算机无法识别的CSV文件中。我想从CSV文件中获取这些名称并填充我可以浏览,排序和添加到计算机的文本文件。 CSV底部还有一些额外的信息,这些信息通过空行与此信息分开。

我知道我应该使用glob模块以及numpy和/或pandas但我只是不知道如何将我需要的所有内容整合到任何类型的工作程序中。这是我对代码的初步尝试。

import csv
import glob
import os
import numpy as np
from StringIO import StringIO

fns = glob.glob('*.csv') 

for fn in fns:
    data = np.genfromtxt(fns, delimiter=',')

    if 'Shoe' or 'Heel' or 'Loafer' or 'sneaker':

    elif 'shirt' or 'tee' or 'tank' or 'polo':

    else:

如果有人有任何代码可以帮助它会很好,但任何帮助将不胜感激。 谢谢

CSV看起来像这样

Name    bunch of stuff                          
header stuff    stuff                           
header stuff    stuff                           
header stuff    stuff                           
header stuff    stuff                           
header stuff    stuff                           
Count   5                           
NUMBER  ITEM    MORE    PRICE1  PRICE2  ETA GOOD    FAULTY  OTHER
N1  Shoe    stuff                                           
N2  Heel    stuff                                           
N3  Tee                                   I     K   
N4  Polo    other   stuff               G       J   
N5  Sneaker other   stuff               H       N                        

3 个答案:

答案 0 :(得分:2)

你的数据格式有点难以理解(实际数据是否分开?)所以我把它变成了一个更简单的例子:

Name    bunch of stuff                          
header stuff    stuff                           
header stuff    stuff                           
header stuff    stuff                           
header stuff    stuff                           
header stuff    stuff                           
Count   5                           
NUMBER,ITEM
N1,Shoe
N2,Heel
N3,Tee
N4,Polo
N5,Sneaker

您可以使用pandas读取这样的csv文件,使用skiprows跳过标题:

import pandas as pd
prod_df = pd.read_csv('prod.csv', skiprows=7)

然后您可以找到数据中包含哪些值(请注意unique()调用意味着您只能获得每个值一次,即使每个值有数百个重复值:

data_products = prod_df['ITEM'].unique()
data_products
Out[22]: array(['Shoe', 'Heel', 'Tee', 'Polo', 'Sneaker'], dtype=object)

将它们与它们应具有的值进行比较:

valid_products = ['Shoe', 'Sneaker']
invalid_data = [x for x in data_products if x not in valid_products]
invalid_data
Out[25]: ['Heel', 'Tee', 'Polo']

答案 1 :(得分:0)

我认为你不够懒惰。让计算机完成所有工作是使编程变得有趣的原因。我会将计算机可以识别的名称加载到一个集合中。然后阅读CSV。这是一个相当简单的问题所以我可能不会将它与Pandas或numpy复杂化。为无法识别的术语制作一个词典。当您进入无法识别的术语时,使用术语作为键以及与该项相同的项目关联的已知术语数组,将其添加到dict中。

完成CSV阅读后,迭代无法识别的术语并使用相关的已知术语来预测术语的含义。

答案 2 :(得分:0)

我绝对是使用Pandas的解决方案的粉丝,但这是使用csv模块的解决方案(使用组合数据)。

#Data for example
f = StringIO("""Number,Item,Price
0,a,.50
1,A,.50
2,B,.75
3,B,.75""")

#Read Data using csv module
parser = csv.DictReader(f, delimiter=',')      #may have to change delimiter

for row in parser:
    print "row data:", "\t", row
    if row['Item'].upper() == 'A': print 'Row contains Item A'
    else: print 'Row does not have Item A'
    print

产生:

row data:       {'Item': 'a', 'Price': '.50', 'Number': '0'}
Row contains Item A

row data:       {'Item': 'A', 'Price': '.50', 'Number': '1'}
Row contains Item A

row data:       {'Item': 'B', 'Price': '.75', 'Number': '2'}
Row does not have Item A

row data:       {'Item': 'B', 'Price': '.75', 'Number': '3'}
Row does not have Item A

最重要的事情是循环DictReader将为您的CSV文件的每一行生成一个字典。根据csv文件的每个条目的分隔,你可能需要更改分隔符,它告诉python如何区分这些条目。