Python 3.x Python 3数据帧的创建取决于文件格式csv或txt
作为一名新的python学习者,我正在根据字典中的文件格式创建dataframe 下面是我正在编写的脚本。 因此,我的主要目标是使用if/else有条件地执行pd.read_csv(文件名),但是,我不确定如何将正确的文件映射到(文件名)部分 在文件名字典中,当存在txt格式的文件时,我希望使用df=pd.read_csv(文件名,分隔符='|')执行它 如果文件是csv格式的,那么我希望通过df=pd.read\u csv(文件名)执行它 是否有人可以帮助我在此处添加哪些内容,以便将文件映射到相应的pd.read\u csv选项Python 3.x Python 3数据帧的创建取决于文件格式csv或txt,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,作为一名新的python学习者,我正在根据字典中的文件格式创建dataframe 下面是我正在编写的脚本。 因此,我的主要目标是使用if/else有条件地执行pd.read_csv(文件名),但是,我不确定如何将正确的文件映射到(文件名)部分 在文件名字典中,当存在txt格式的文件时,我希望使用df=pd.read_csv(文件名,分隔符='|')执行它 如果文件是csv格式的,那么我希望通过df=pd.read\u 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 = '|')
我认为你有正确的基本想法。唯一的问题是,您将创建数量可变的数据帧。为此,我建议将其组织到数据帧字典中 示例: 说
1.txt
包含:
a|b|c
1|2|3
a,b,c
4,5,6
和2.csv
包含:
a|b|c
1|2|3
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
您可以使用
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'
]
一旦你有了这个列表,你也可以在列表理解中创建一个数据帧列表。如果你只是想让你的代码正常工作,在你的
pd中将文件名更改为文件
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的答案。你的想法会奏效,但需要更好的组织,这样你就不会不断地覆盖同一个变量。使用列表或字典保存它们。感谢您的输入。你知道有没有办法按文件格式创建df?例如,如果有多个csv文件,是否有方法仅为该文件格式创建df?@JungLee我编辑了答案,试图解决此问题。谢谢您的帮助。我的最后一个问题是,有没有办法创建一个脚本来为每个文件创建数据帧?假设有一个windowspath c:\user\包含3个csv文件和3个txt文件。[1.txt,2.txt,3.txt,4.csv,5.csv,6.csv]如果我想用python创建1对1的数据帧,我应该使用哪种迭代格式?提前谢谢!