【问题标题】:Iterate through multiple CSV's checking for an integer value in each file遍历多个 CSV 检查每个文件中的整数值
【发布时间】:2017-03-18 21:05:17
【问题描述】:

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

我正在尝试遍历文件夹中的多个 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")   

【问题讨论】:

  • 从一小部分文件开始;让负载和检查工作良好的一个文件。然后只需遍历文件并收集数据。字典,也许是defaultdict 也是开始收集的好地方。但是只有几个 K 文件,数据结构并不是什么大问题。在这一点上,您的描述太模糊,无法提出更具体的建议。
  • 感谢@hpaulj,感谢您的意见。

标签: python-3.x pandas numpy genfromtxt


【解决方案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'

【讨论】:

  • 感谢@MaxU,这绝对是我可以使用的。漂亮!
  • 谢谢;我遇到的唯一问题是:文件名的格式为 touchscreen_data_123456_1456789456_178.16.66.3,在这种情况下,第三组字符串即“123456”,请更改。这个集合可能有 10k,另一个可能有 10,那么获取每个唯一 id 并将每个字段的计数字段相加的最佳方法是什么?我想我可以将它导入一个 SQL 表并在 SQL 中相当容易地做到这一点,但很高兴学习如何在 python 中这样做
  • 能够将 df 插入 sql server,我可以在那里进行处理。再次感谢,如果您对我之前的评论有建议,我将不胜感激。
【解决方案2】:

因为您要求提供模块和可能的用法。 你可能会考虑这样的事情。 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 数据库。

【讨论】:

    【解决方案3】:

    如果所有文件都在一个文件夹中,您可以使用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
    

    类似的...

    【讨论】:

      猜你喜欢
      • 2019-07-21
      • 2015-08-26
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      • 2011-03-07
      • 2013-04-23
      • 2021-12-18
      相关资源
      最近更新 更多