迭代多个CSV检查每个文件中的整数值

时间:2016-11-04 22:40:51

标签: python-3.x pandas numpy genfromtxt

我是python的新手,可以使用我能得到的任何帮助。我在win7机器上使用python 3.5(anaconda)

我正在尝试遍历文件夹中的多个CSV文件(10k +),检查该文件中超出预定义阈值的任何值。

我想构建一个字典,或者列表/元组(基本上最类似于sql表),使用文件名的子字符串作为名称字段的唯一标识符,并且有另一列,其中包含文件总数具有超过给定阈值的值。

我不希望你们中的任何人为我这样做,因为这是一个很好的做法,但我将不胜感激任何模块的建议,可能会让这更容易。

我已经能够检查一个文件的值,但是这个任务只有大约10分钟,我不知道如何迭代多个文件并构建表等等。谢谢!

278 ms

3 个答案:

答案 0 :(得分:1)

因为您要求提供模块和可能的用法。 你可能会考虑这样的事情。 import os import sqlite3 for root, dirs, files in os.walk(): //using os module if file == somethingyouwanttoparse: //ie *.csv with open as f: if line data == IWantToSaveThis: insert data into sqlite table //using sqlite3 module
https://docs.python.org/3/library/os.html https://docs.python.org/3.5/library/sqlite3.html 我倾向于尽可能使用实际的SQL数据库。

答案 1 :(得分:1)

这是Pandas的解决方案:

import glob
import os
import pandas as pd

all_files = glob.glob(r'd:/temp/csv/*.csv')

threshold = 100

data = []

for f in all_files:
    data.append([os.path.basename(f),
                (pd.read_csv(f, header=None) > threshold).sum().sum()])

df = pd.DataFrame(data, columns=['file','count'])

print(df)

# optionally save DataFrame to SQL table (`conn` - is a SQLAlchemy connection)
#df.to_sql('table_name', conn)

输出:

    file  count
0  1.csv      2
1  2.csv      3

测试数据:

1.csv:

1,2,3,400
10,111,45,67

2.csv:

1,200,300,4
10,222,45,67

<强>更新

你可以用这种方式解析文件名中的第一个数字:

In [87]: import re

In [88]: f
Out[88]: '/path/to/touchscreen_data_123456_1456789456_178.16.66.3'

In [89]: re.sub(r'.*_\D+_(\d+)_\d+.*', r'\1', f)
Out[89]: '123456'

答案 2 :(得分:0)

如果所有文件都在一个文件夹中,您可以使用类似glob的内容来完成所有文件。然后使用csv测试状态:

found=[]
for fn in glob.glob('c:\\path\\*.csv'):
    with open(fn) as f:
        for row in csv.reader(f):
             if tgt_value_as_string in row:
                  found.append(fn)
                  break

像这样......