我有一个要导入到数据框中的文件列表
信用证号码:
# list contains the dataset name followed by the column name to match all the datasets; this list keeps changing and even the file formats. These dataset file names are provided by the user, and they are unique.
# First: find the file extension format and select appropriate pd.read_ to import
# second: merge the dataframes on the index
# in the below list,
file_list = ['dataset1.csv','datetime','dataset2.xlsx','timestamp']
df = pd.DataFrame()
for i in range(0:2:len(file_list)):
# find the file type first
# presently, I don't know how to find the file type; so
file_type = 'csv'
# second: merge the dataframe into the existing dataframe on the index
tdf = pd.DataFrame()
if file_type == 'csv':
tdf = pd.read_csv('%s'%(file_list[i])))
if file_type == 'xlsx':
tdf = pd.read_excel('%s'%(file_list[i])))
tdf.set_index('%s'%(file_list[i+1]),inplace=True)
# Merge dataframe with the existing dataframe
df = df.merge(tdf,right_index=True,left_index=True)
我已经到了这里。有任何直接模块可以找到文件类型吗?我找到了magic
,但导入时出现了问题。另外,建议一个更好的方法来合并文件吗?更新:工作解决方案从下面的@ljdyer回答中得到启发,我得到了下面的答案,这是完美的工作:
def find_file_type_import(file_name):
# Total file extensions possible for importing data
file_type = {'csv':'pd.read_csv(file_name)',
'xlsx':'pd.read_excel(file_name)',
'txt':'pd.read_csv(file_name)',
'parquet':'pd.read_parquet(file_name)',
'json':'pd.read_json(file_name)'
}
df = [eval(val) for key,val in file_type.items() if file_name
.endswith(key)][0]
return df
df = find_file_type_import(file_list [0])
这是完美的工作。感谢您的宝贵建议。另外,纠正我与使用eval
是好的一个或不?
3条答案
按热度按时间r1zhe5dt1#
文件类型只是文件名末尾的三个或四个字母,因此最简单的方法是:
等等。
其他公共选项可以是
os.path.splitext
或Path
对象的suffix
属性(分别来自内置的os
和pathlib
库)。合并的方式看起来不错,但我不知道为什么要对
read_
、set_index
等参数使用百分比表示法。列表中的元素只是字符串,例如可能只是:
(对后续问题的答复)
使用
dict
真是个好主意!通常认为尽可能避免使用eval
是一个好习惯,所以这里有一个替代选项,panda函数本身作为字典值。我还建议使用一个更漂亮的语法来理解列表,只有一个元素基于this answer,还有一些更清晰的变量名:j0pj023g2#
你可以使用glob(或者仅仅使用os)来从文件名的一部分中检索文件列表。因为你保证了文件的唯一性,而不管扩展名是什么,所以它只能是一个(否则就用一个循环来遍历检索到的元素)。
一旦你有了完整的文件名(它显然有扩展名),只需执行一个split(),获取对应于文件扩展名的最后一个元素。
然后,您可以使用适当的函数读取 Dataframe 。
下面是一个代码示例:
输出将为:
anauzrmj3#
使用pathlib和一个switch dict来调用函数。