使用 Python 从目录中读取所有 csv 文件
Read in all csv files from a directory using Python
我希望这不是微不足道的,但我想知道以下内容:
如果我有一个包含 n csv
个文件的特定文件夹,我怎么能一次一个地迭代读取所有这些文件,并对它们执行一些计算值?
例如,对于单个文件,我执行类似的操作并对 x
数组执行一些计算:
import csv
import os
directoryPath=raw_input('Directory path for native csv file: ')
csvfile = numpy.genfromtxt(directoryPath, delimiter=",")
x=csvfile[:,2] #Creates the array that will undergo a set of calculations
我知道我可以检查给定文件夹中有多少 csv
个文件(检查 here):
import glob
for files in glob.glob("*.csv"):
print files
但我没有弄清楚如何将 numpy.genfromtxt()
函数嵌套在 for 循环中,因此我读入了由我指定的目录的所有 csv 文件。
编辑
我的文件夹只有jpg
和csv
个文件。后者被命名为 eventX.csv
,其中 X 的范围从 1 到 50。因此,我所指的 for
循环应该按原样考虑文件名。
我就是这样做的:
import os
directory = os.path.join("c:\","path")
for root,dirs,files in os.walk(directory):
for file in files:
if file.endswith(".csv"):
f=open(file, 'r')
# perform calculation
f.close()
我想你在找这样的东西
import glob
for file_name in glob.glob(directoryPath+'*.csv'):
x = np.genfromtxt(file_name,delimiter=',')[:,2]
# do your calculations
编辑
如果您想从文件夹(包括子文件夹)中获取所有 csv
文件,您可以使用 subprocess
而不是 glob
(请注意,此代码仅适用于 linux系统)
import subprocess
file_list = subprocess.check_output(['find',directoryPath,'-name','*.csv']).split('\n')[:-1]
for i,file_name in enumerate(file_list):
x = np.genfromtxt(file_name,delimiter=',')[:,2]
# do your calculations
# now you can use i as an index
它首先使用 shell 中的 find
命令搜索所有 file_names 的文件夹和子文件夹,然后应用您的计算。
根据numpy.genfromtxt()
的documentation,第一个参数可以是
File, filename, or generator to read.
这意味着您可以编写一个生成器来生成所有文件的行,如下所示:
def csv_merge_generator(pattern):
for file in glob.glob(pattern):
for line in file:
yield line
# then using it like this
numpy.genfromtxt(csv_merge_generator('*.csv'))
应该可以。 (我没有安装numpy,所以不能轻易测试)
使用 pandas 和 glob 作为基础包
import glob
import pandas as pd
glued_data = pd.DataFrame()
for file_name in glob.glob(directoryPath+'*.csv'):
x = pd.read_csv(file_name, low_memory=False)
glued_data = pd.concat([glued_data,x],axis=0)
这里有一个更简洁的方法,给定一些 path = "/path/to/dir/"
。
import glob
import pandas as pd
pd.concat([pd.read_csv(f) for f in glob.glob(path+'*.csv')])
然后您可以将您的计算应用于整个数据集,或者,如果您想逐一应用它:
pd.concat([process(pd.read_csv(f)) for f in glob.glob(path+'*.csv')])
下面的函数将return一个包含数据框的字典,用于定义路径[=16=中的文件夹中的每个.csv文件].
import pandas as pd
import glob
import os
import ntpath
def panda_read_csv(path):
pd_csv_dict = {}
csv_files = glob.glob(os.path.join(path, "*.csv"))
for csv_file in csv_files:
file_name = ntpath.basename(csv_file)
pd_csv_dict['pd_' + file_name] = pd.read_csv(csv_file, sep=";", encoding='mac_roman')
locals().update(pd_csv_dict)
return pd_csv_dict
您需要导入 glob 库,然后像下面这样使用它:
import glob
path='C:\Users\Admin\PycharmProjects\db_conection_screenshot\seclectors_absent_images'
filenames = glob.glob(path + "\*.png")
print(len(filenames))
您可以使用 pathlib
glob
功能列出路径中的所有 .csv,并使用 pandas
读取它们。
那么这只是应用你想要的任何功能的问题(如果系统化,也可以在列表理解中完成)
import pands as pd
from pathlib import Path
path2csv = Path("/your/path/")
csvlist = path2csv.glob("*.csv")
csvs = [pd.read_csv(g) for g in csvlist ]
我希望这不是微不足道的,但我想知道以下内容:
如果我有一个包含 n csv
个文件的特定文件夹,我怎么能一次一个地迭代读取所有这些文件,并对它们执行一些计算值?
例如,对于单个文件,我执行类似的操作并对 x
数组执行一些计算:
import csv
import os
directoryPath=raw_input('Directory path for native csv file: ')
csvfile = numpy.genfromtxt(directoryPath, delimiter=",")
x=csvfile[:,2] #Creates the array that will undergo a set of calculations
我知道我可以检查给定文件夹中有多少 csv
个文件(检查 here):
import glob
for files in glob.glob("*.csv"):
print files
但我没有弄清楚如何将 numpy.genfromtxt()
函数嵌套在 for 循环中,因此我读入了由我指定的目录的所有 csv 文件。
编辑
我的文件夹只有jpg
和csv
个文件。后者被命名为 eventX.csv
,其中 X 的范围从 1 到 50。因此,我所指的 for
循环应该按原样考虑文件名。
我就是这样做的:
import os
directory = os.path.join("c:\","path")
for root,dirs,files in os.walk(directory):
for file in files:
if file.endswith(".csv"):
f=open(file, 'r')
# perform calculation
f.close()
我想你在找这样的东西
import glob
for file_name in glob.glob(directoryPath+'*.csv'):
x = np.genfromtxt(file_name,delimiter=',')[:,2]
# do your calculations
编辑
如果您想从文件夹(包括子文件夹)中获取所有 csv
文件,您可以使用 subprocess
而不是 glob
(请注意,此代码仅适用于 linux系统)
import subprocess
file_list = subprocess.check_output(['find',directoryPath,'-name','*.csv']).split('\n')[:-1]
for i,file_name in enumerate(file_list):
x = np.genfromtxt(file_name,delimiter=',')[:,2]
# do your calculations
# now you can use i as an index
它首先使用 shell 中的 find
命令搜索所有 file_names 的文件夹和子文件夹,然后应用您的计算。
根据numpy.genfromtxt()
的documentation,第一个参数可以是
File, filename, or generator to read.
这意味着您可以编写一个生成器来生成所有文件的行,如下所示:
def csv_merge_generator(pattern):
for file in glob.glob(pattern):
for line in file:
yield line
# then using it like this
numpy.genfromtxt(csv_merge_generator('*.csv'))
应该可以。 (我没有安装numpy,所以不能轻易测试)
使用 pandas 和 glob 作为基础包
import glob
import pandas as pd
glued_data = pd.DataFrame()
for file_name in glob.glob(directoryPath+'*.csv'):
x = pd.read_csv(file_name, low_memory=False)
glued_data = pd.concat([glued_data,x],axis=0)
这里有一个更简洁的方法,给定一些 path = "/path/to/dir/"
。
import glob
import pandas as pd
pd.concat([pd.read_csv(f) for f in glob.glob(path+'*.csv')])
然后您可以将您的计算应用于整个数据集,或者,如果您想逐一应用它:
pd.concat([process(pd.read_csv(f)) for f in glob.glob(path+'*.csv')])
下面的函数将return一个包含数据框的字典,用于定义路径[=16=中的文件夹中的每个.csv文件].
import pandas as pd
import glob
import os
import ntpath
def panda_read_csv(path):
pd_csv_dict = {}
csv_files = glob.glob(os.path.join(path, "*.csv"))
for csv_file in csv_files:
file_name = ntpath.basename(csv_file)
pd_csv_dict['pd_' + file_name] = pd.read_csv(csv_file, sep=";", encoding='mac_roman')
locals().update(pd_csv_dict)
return pd_csv_dict
您需要导入 glob 库,然后像下面这样使用它:
import glob
path='C:\Users\Admin\PycharmProjects\db_conection_screenshot\seclectors_absent_images'
filenames = glob.glob(path + "\*.png")
print(len(filenames))
您可以使用 pathlib
glob
功能列出路径中的所有 .csv,并使用 pandas
读取它们。
那么这只是应用你想要的任何功能的问题(如果系统化,也可以在列表理解中完成)
import pands as pd
from pathlib import Path
path2csv = Path("/your/path/")
csvlist = path2csv.glob("*.csv")
csvs = [pd.read_csv(g) for g in csvlist ]