作为一个新的python学习者,我正在根据字典中的文件格式来创建数据框。
下面是我正在处理的脚本。 因此,我的主要目标是使用if / else有条件地执行pd.read_csv(filename)。但是,我不确定如何将正确的文件映射到(filename)部分。
在文件名字典中,当存在txt格式的文件时,我想使用df = pd.read_csv(filename,delimiter ='|')执行该文件 如果文件在csv中,那么我想通过df = pd.read_csv(filename)执行它 有人可以帮我,需要在此处添加哪些内容才能将文件映射到适当的pd.read_csv选项?
filename = ["1.txt","2.csv","3.txt","4.csv"...etc]
sub = '.csv'
for file in filename:
if sub in file:
df = pd.read_csv(filename)
else:
df = pd.read_csv(filename, delimiter = '|')
答案 0 :(得分:2)
我认为您有正确的基本想法。唯一的是,您将要创建可变数量的数据帧。为此,我建议将其组织成一个数据帧字典。
示例:
说1.txt
包含:
a|b|c
1|2|3
和2.csv
包含:
a,b,c
4,5,6
然后您可以执行以下操作:
filename = ["1.txt", "2.csv"]
sub = '.csv'
# Create empty dictionary
dict_of_dfs = {}
# Iterate through your files
for f in filename:
# if .csv is found, add a dictionary key with the filename minus the extension
# Use default delimiter
if sub in f:
dict_of_dfs[f[:-4]] = pd.read_csv(f)
# For other (.txt) files, just change the delimiter
else:
dict_of_dfs[f[:-4]] = pd.read_csv(f, delimiter='|')
您将可以像访问其他任何字典一样访问数据帧,只需使用文件名减去扩展名作为键即可:
>>> dict_of_dfs['1']
a b c
0 1 2 3
>>> dict_of_dfs['2']
a b c
0 4 5 6
答案 1 :(得分:0)
您可以使用zip
封装所需的功能,并列出理解:
# Create a list that maps the file's extension to a delimiter
delimiters = [
None if sub in file else '|'
for file in filename
]
# Iterate through the delimiter/file pairs produced by zip
for delimiter, file in zip(delimiters, filename):
df = pd.read_csv(file, delimiter=delimiter)
如果您有兴趣获取仅CSV文件的列表,我建议您使用Python的pathlib
模块:
from pathlib import Path
here = Path('.')
csvs = [
file for file in here.iterdir()
if file.suffix == 'csv'
]
有了该列表后,您还可以列表理解的方式创建一个数据框列表。
答案 2 :(得分:0)
如果只希望代码能工作,请在filename
语句中将file
更改为pd.read_csv
:
filename = ["1.txt","2.csv","3.txt","4.csv"...etc]
sub = '.csv'
for file in filename:
if sub in file:
df = pd.read_csv(file)
else:
df = pd.read_csv(file, delimiter = '|')
但是,这只会导致df
一直被覆盖,因此最后df
仅等于您的最后一个文件。如果您想要一个完整的解决方案,请使用 sacul 的答案。