python - 取出 CSV 的一些内容

标签 python csv pandas glob

我是编程新手,我有一堆 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) 

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

最佳答案

假设 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

如果您想写入单个 csv,

mode='a' 会附加到单个 csv 文件(称为 out.csv)文件,那么你应该相应地调整你的代码

关于python - 取出 CSV 的一些内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18344887/

相关文章:

python - Scipy curve_fit 给出了错误的答案

python - celery 用作代理时能否优雅地承受 mongodb 故障转移?

python - Pandas Loc 按索引选择以及单个表达式中的 bool 条件

python - 如何在 Pandas 中使用 group_by 函数计算加权平均值

python - 如何使用 url 中未显示的参数进行重定向?

python - 带有自定义类的 pickle

csv - 生成 XLS 电子表格时如何不超过最大字体数量

PHP - 使用 LOAD DATA INFILE 将 CSV 文件导入 mysql 数据库

python - 使用 numpy 从 csv 加载一定数量的行

python - 在Python中处理大型字典和数据帧