2016-11-04 67 views
2

我是python的新手,可以使用我可以获得的任何帮助。我在一台win7机器上,正在使用python 3.5(anaconda)遍历多个CSV检查每个文件中的整数值

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

我想建立一个字典,或列表/元组(基本上是最类似于一个SQL表),使用文件名的子字符串作为名称字段的唯一标识符,并有另一列文件总数那些值超过了给定的阈值。

我不指望你们中的任何人为我做这件事,因为这是很好的做法,但我希望任何可能使这一点变得更容易的模块建议。

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

import numpy as np 
path = 'C:\\path' 
file = 'file.csv' 
with open(path+file) as f: 
    my_data = np.genfromtxt(path+file, delimiter = ",") 
    for data in my_data: 
     if -1 in my_data: 
      print("it sure is") 
+1

开始与一小部分的文件;获得负载并检查一个文件的运行状况。然后只是迭代文件并收集数据。字典,也许'defaultdict'是开始收集的好地方。但只有几个K文件,数据结构并不是什么大问题。在这一点上,你的描述太模糊,不能提出更具体的建议。 – hpaulj

+0

感谢@hpaulj我很感激你的意见。 – StelioK

回答

1

这里工作大熊猫的解决方案:

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 

UPDATE:

可以从文件名这样分析的第一个数字:

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' 
+0

感谢@MaxU,这绝对是我可以使用的东西。美丽! – StelioK

+0

@StelioK,谢谢你接受答案:) – MaxU

+0

谢谢;唯一的问题是我有这样的:文件名的形式是touchscreen_data_123456_1456789456_178.16.66.3,第三组字符串,即在这种情况下,“123456”,改变。这个集合可能有10k,而另一个可能是10k,那么抓住每个唯一ID并将每个计数字段相加的最好方法是什么?我想我可以导入到一个SQL表中,并在SQL中很容易做到这一点,但会很高兴知道如何在Python中执行此操作 – StelioK

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 

类似的东西...

+0

为什么选择投票? – dawg

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数据库。