Python 取出CSV的位
我是编程新手,我有一堆CSV文件,每个文件大约有50到60行。在未指定数量的行之后,第二列中有一个名为“NAME”的字符串。我想把“NAME”后面第二列中的所有内容都打印到文本文件中。我最初想使用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
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