取出一些CSV

时间:2013-08-20 21:01:15

标签: python csv pandas glob

我是编程新手,我有一堆CSV文件,每个文件大约有50到60行。在未指定数量的行之后,第二列中有一个名为“NAME”的字符串。我想在'NAME'之后的第二列中取出所有内容并将其打印到文本文件中。我最初考虑使用pandasskiprows来执行此操作,但问题是我运行的每个csv都会在另一行中包含“NAME”。此外,如果有帮助,每个CSV中的“NAME”前面会有三行空行。

header, header   
header, header                           
NUMBER,ITEM
N1,Shoe
N2,Heel
N3,Tee, random stuff
N4,Polo, random stuff
N5,Sneaker
N10,Heel
N11,Tee
...
...
...

How         
Count   17      
SORT,NAME       
H1,Thing, random stuff   
H2,WTANK        
H3,TEE2  
H4,TEE  

我还希望在文本文件中没有重复,因为我将在目录中运行大约1000个CSV。这是我开始使用的一些代码,也是我遇到的问题。

import pandas as pd
import csv
import glob

fns = glob.glob('*.csv') #goes through every CSV file in director
for csv in fns:
    prod_df = pd.read_csv(csv, skiprows=???)
    with open (os.path.join('out', fn), 'wb') as f:
        w = csv.writer(f)
        test_alias = prod_df['NAME'].unique()
        w.writerow(row) 

我知道它不起作用,可能不是很好的代码。任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:1)

假设NAME只出现一次,您可以使用get_loc

import pandas as pd
import glob

fn = 'out.csv'
fns = glob.glob('*.csv') #goes through every CSV file in director
colname = 'ITEM'
rowname = 'NAME'
for csv in fns:
    s = pd.read_csv(csv, usecols=[colname], squeeze=True, skiprows=7, header=0)
    row_idx = pd.Index(s).get_loc(rowname)
    sub_items = s[row_idx + 1:]
    pd.Series(sub_items.unique()).to_csv(fn, mode='a')

编辑:解释

usecols只会读取您需要的列,即ITEM

squeeze=True返回Series

get_loc返回其参数的索引

你说 'NAME'之后你想要一切,所以索引是row_idx + 1

mode='a'附加到单个csv文件(名为out.csv),如果您要写入个别 csv文件,则应相应调整代码

答案 1 :(得分:0)

这是一种方式

import pandas as pd
import csv
import glob

fns = glob.glob('*.csv') #goes through every CSV file in director
for csv in fns:
    df = pd.read_csv(csv)
    row_idx = (df.ITEM == 'NAME').idxmax()
    sub_items = df.ITEM[row_idx:]
    sub_items.unique().to_csv(os.path.join('out', fn))