我有一个脚本,当前从.csv文件中读取原始数据,并对数据执行一些pandas数据分析。目前.csv文件是硬编码的,读入方式如下:
data = pd.read_csv('test.csv',sep="|", names=col)
我想改变两件事:
我想把它变成一个循环,所以它循环遍历.csv文件的目录,并在脚本中的每一个下面执行pandas分析。
我想获取每个.csv文件并删除'.csv'并将其存储在另一个列表变量中,我们称之为'new_table_list'。
我认为我需要类似下面的东西,至少在第一点(尽管我知道这不完全正确)。我不知道如何解决第二点
感谢任何帮助
import os
path = '\test\test\csvfiles'
table_list = []
for filename in os.listdir(path):
if filename.endswith('.csv'):
table_list.append(file)
data = pd.read_csv(table_list,sep="|", names=col)
答案 0 :(得分:3)
有很多方法可以做到这一点
for filename in os.listdir(path):
if filename.endswith('.csv'):
table_list.append(pd.read_csv(filename,sep="|"))
new_table_list.append(filename.split(".")[0])
再一次
for filename in os.listdir(path):
if filename.endswith('.csv'):
table_list.append(pd.read_csv(filename,sep="|"))
new_table_list.append(filename[:-4])
还有更多
正如@barmar指出的那样,最好将路径附加到table_list
以避免与文件和脚本的路径和位置相关的任何问题。
答案 1 :(得分:3)
您可以尝试这样的事情:
import glob
data = {}
for filename in glob.glob('/path/to/csvfiles/*.csv'):
data[filename[:-4]] = pd.read_csv(filename, sep="|", names=col)
然后data.keys()
是没有" .csv"的文件名列表。 part和data.values()
是一个列表,每个文件都有一个pandas数据帧。
答案 2 :(得分:2)
要获取目录中的列表CSV文件使用glob
它比os
from glob import glob
# csvs will contain all CSV files names ends with .csv in a list
csvs = glob('you\\dir\\to\\csvs_folder\\*.csv')
# remove the trailing .csv from CSV files names
new_table_list = [csv[:-3] for csv in csvs]
# read csvs as dataframes
dfs = [pd.read_csv(csv, sep="|", names=col) for csv in csvs]
#concatenate all dataframes into a single dataframe
df = pd.concat(dfs, ignore_index=True)
答案 3 :(得分:1)
import os
path = 'your path'
all_csv_files = [f for f in os.listdir(path) if f.endswith('.csv')]
for f in all_csv_files:
data = pd.read_csv(os.path.join(path, f), sep="|", names=col)
# list without .csv
files = [f[:-4] for f all_csv_files]
答案 4 :(得分:1)
我开始使用pathlib
from pathlib import Path
然后利用stem
属性和glob
方法。
让我们做一个导入功能
def read_csv(f):
return pd.read_csv(table_list, sep="|")
最通用的方法是存储在字典中
p = Path('\test\test\csvfiles')
dod = {f.stem: read_csv(f) for f in p.glob('*.cvs')}
您还可以使用pd.concat
将其转换为数据框
df = pd.concat(dod)
答案 5 :(得分:0)
您可以(在打开时)将文件名添加到Dataframe属性中,如下所示:
ds.attrs['filename']='filename.csv'
您可以随后在数据框中查询名称
ds.attrs['filename']
'filename.csv'