Python 取出CSV的位

Python 取出CSV的位,python,csv,pandas,glob,Python,Csv,Pandas,Glob,我是编程新手,我有一堆CSV文件,每个文件大约有50到60行。在未指定数量的行之后,第二列中有一个名为“NAME”的字符串。我想把“NAME”后面第二列中的所有内容都打印到文本文件中。我最初想使用pandas和skiprows来实现这一点,但问题是,我运行的每个csv都会在不同的行中有“NAME”。此外,如果有帮助的话,在每个CSV的“名称”前三行有一个空行 header, header header, header NUMBER,IT

我是编程新手,我有一堆CSV文件,每个文件大约有50到60行。在未指定数量的行之后,第二列中有一个名为“NAME”的字符串。我想把“NAME”后面第二列中的所有内容都打印到文本文件中。我最初想使用
pandas
skiprows
来实现这一点,但问题是,我运行的每个csv都会在不同的行中有“NAME”。此外,如果有帮助的话,在每个CSV的“名称”前三行有一个空行

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) 
我知道它不起作用,可能不是很好的代码。任何帮助都将不胜感激。谢谢大家!

这是一种方法

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))
这是一种方式

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))

假设
NAME
只出现一次,您可以使用
get\u 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
只读取您需要的列,即

squeak=True
返回一个
序列

get_loc
返回其参数的索引

你说你想要在
'NAME'
之后的所有内容,所以索引是
行\u idx+1


mode='a'
附加到单个csv文件(称为
out.csv
),如果要写入单个csv文件,则应相应调整代码假设
NAME
只出现一次,您可以使用
get\u 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
只读取您需要的列,即

squeak=True
返回一个
序列

get_loc
返回其参数的索引

你说你想要在
'NAME'
之后的所有内容,所以索引是
行\u idx+1


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

实际csv有两列以上。我只是在这里简化了它。很抱歉,实际的CSV有两列以上。我只是在这里简化了它。很抱歉,在实际的CSV中,第二列中的第一项有所不同,因为它通常是文件名。有没有一种方法可以跳过标题并执行此操作?我对示例做了一点修改,以显示是否有固定数量的标题行?我已经编辑了我的答案。您可以将
skiprows=7
传递给
read_csv
。再次编辑后,您还必须传递
header=0
来告诉
read_csv
您想使用
'ITEM'
作为列名。现在它说'numpy.ndarray'没有属性'to_csv'。在实际的csv中,第二列中的第一项不同,因为它通常是文件名。有没有一种方法可以跳过标题并执行此操作?我对示例做了一点修改,以显示是否有固定数量的标题行?我已经编辑了我的答案。您可以将
skiprows=7
传递给
read_csv
。再次编辑后,您还必须传递
header=0
来告诉
read_csv
您想使用
'ITEM'
作为列名。现在它说'numpy.ndarray'没有属性'to_csv'。是否可以按原样读取上面给定的文本。我无法使其工作:从StringIO导入StringIO df=pd。读取表格(StringIO(原始),标题=0,skiprows=2,sep=“,”),错误C错误:第6行中应有2个字段,saw 3是否可以按原样读取上面的给定文本。我无法让它工作:从StringIO导入StringIO df=pd.read_表(StringIO(原始),标题=0,skiprows=2,sep=“,”),错误C错误:第6行中预期有2个字段,saw 3