0

我是编程新手,我有许多 CSV 文件需要处理。每个 CSV 文件都有一个 8 行标题。在标题之后,有一行名称和数据。第二列有一堆产品名称,这是我现在主要关心的。每个产品都有一组特定的名称,我们的计算机可以识别这些名称。例如,鞋子会被识别为:shoe、sneaker、heel、loafer 等。随着时间的推移,其他名称已潜入计算机无法识别的 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                        
4

3 回答 3

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']
于 2013-08-12T23:59:07.967 回答
0

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

阅读完 CSV 文件后,遍历无法识别的术语并使用相关的已知术语来预测该术语的含义。

于 2013-08-12T23:59:41.633 回答
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 如何区分条目。

于 2013-08-13T00:12:18.523 回答