【问题标题】:How to use loops to adjust path names如何使用循环来调整路径名
【发布时间】:2020-11-14 07:52:24
【问题描述】:

我正在开发一个分析大量 csv 文件的程序。 目前我正在手动声明每个项目,但正如您在我的代码中看到的那样,我实际上只是在我的路径和变量名中 +1。 我想我可以用一个循环来简化它,只是不知道如何用路径名来做到这一点。

我的代码:

import pandas as pd
import numpy as np 

### declation ###
df_primes1 = pd.DataFrame()
df_primes1 = np.array(df_primes1)
df_search1 = pd.DataFrame()

df_primes2 = pd.DataFrame()
df_primes2 = np.array(df_primes2)
df_search2 = pd.DataFrame()

df_primes3 = pd.DataFrame()
df_primes3 = np.array(df_primes3)
df_search3 = pd.DataFrame()

searchterm = '322'

### reads csv in numpy array ###
df_primes1 = pd.read_csv('1/1_Primes_32.csv', delimiter=';', header=None, names='1')
df_primes2 = pd.read_csv('1/2_Primes_32.csv', delimiter=';', header=None, names='2')
df_primes3 = pd.read_csv('1/3_Primes_32.csv', delimiter=';', header=None, names='3')

### sorts prime numbers ###
#df_sorted = df_primes1.sort_values(by='n')
#print(df_sorted)


### searches for number with "searchterm" as start value ###
df_search1 = df_primes1[df_primes1['1'].astype(str).str.startswith(searchterm)]['1']
df_search2 = df_primes2[df_primes2['2'].astype(str).str.startswith(searchterm)]['2']
df_search3 = df_primes3[df_primes3['3'].astype(str).str.startswith(searchterm)]['3']


print(df_search1)
print(df_search2)
print(df_search3)

程序正在运行,我只是想知道如何简化它,因为这样的文件还有 20 多个。

【问题讨论】:

  • 你知道 Python 中标准库中的路径模块吗?即pathlibos 你可以通过一个简单的glob 调用来获取所有路径 - from pathlib import Path;Path(your_path).glob('*Primes*.csv') 或类似的东西; 是一个换行符,这里返回一个生成器,你可以用@987654327 把它变成一个列表@
  • 感谢您的快速答复。如何区分每个 csv 文件写入另一个数据帧?
  • 您是否要读取所有文件并将每个文件存储在不同的数据框中并搜索特定列,例如您读取文件1/3_Primes_32.csv,而不是要在第 3 列中搜索字符串并打印它。是对吗?
  • 我想将每个文件写入不同的数据框中。之后,我想对所有数据帧进行相同的分析(例如搜索以 322 开头的数字)并打印每个数据帧的输出。输出如下所示:33 3223402517 74 3229416881 129 3227514877

标签: python pandas numpy loops csv


【解决方案1】:

IIUC,我们可以使用 pathlib 和 dict 理解:

from pathlib import Path

p = 'Path/to/your_csv/'

dfs = {
    f"search_{i}": pd.read_csv(file, delimiter=";", 
                                     header=None, 
                                     names=str(i))
    for i, file in enumerate(Path(p).glob("*Prime*.csv"), 1)
}

分解每个项目,

p 是保存 csvs 的目标文件夹

i 是一个枚举器,用于遍历您的文件,您很可能需要添加一个对 csv 进行排序以获得所需顺序的前置步骤。

file 是从生成器对象返回的每个项目。我们将每个值变成一个数据框。

您可以按您的集合过滤每个数据框,即

dfs['search_1']

这将返回一个数据框。

【讨论】:

  • 我尝试了您的建议,但收到错误:dfs['search_1'] KeyError: 'search_1'
  • @SaveOurPlanet print(dfs.keys())
  • 现在我收到: Traceback(最近一次调用最后一次):…/test_file.py",第 20 行,在 中 for i,文件在 enumerate(Path(p).glob("* Primes_32.csv"), 1) .../test_file.py", 第 20 行,在 for i,文件在 enumerate(Path(p).glob("*Primes_32.csv"), 1) .../pandas/ io/parsers.py",第 676 行,在 parser_f 返回 _read(filepath_or_buffer,kwds) .../pandas/io/parsers.py",第 445 行,在 _read _validate_names(kwds.get("names", None)) .../ pandas/io/parsers.py",第 413 行,在 _validate_names 中引发 ValueError("不允许重复名称。")
猜你喜欢
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2019-07-06
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
相关资源
最近更新 更多