我是编程新手,我有一堆CSV文件,每个文件大约有50到60行。在未指定数量的行之后,第二列中有一个名为“NAME”的字符串。我想在'NAME'之后的第二列中取出所有内容并将其打印到文本文件中。我最初考虑使用pandas
和skiprows
来执行此操作,但问题是我运行的每个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)
我知道它不起作用,可能不是很好的代码。任何帮助将不胜感激。谢谢!
答案 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))